LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENPUFlSSUdIVDogCiAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZAogKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJsb2N0ZXN0LmgiCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAidW5pY29kZS9kZWNpbWZtdC5oIgovLyNpbmNsdWRlICJ1bmljb2RlL2RhdGVmbXQuaCIKI2luY2x1ZGUgInVuaWNvZGUvc21wZHRmbXQuaCIKCi8vICogdGVzdCBtYWNyb3MKLyoKIFVzYWdlOgogICAgdGVzdF9jb21wYXJlKCAgICBGdW5jdGlvbiB0byBiZSBwZXJmb3JtZWQsCiAgICAgICAgICAgICAgICAgICAgICAgVGVzdCBvZiB0aGUgZnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgcmVzdWx0IG9mIHRoZSB0ZXN0LAogICAgICAgICAgICAgICAgICAgICAgIHByaW50YWJsZSByZXN1bHQKICAgICAgICAgICAgICAgICAgKQoKICAgRXhhbXBsZToKICAgICAgIHRlc3RfY29tcGFyZShpPTMsaSwzLCBzb21lTnVtYmVyRm9ybWF0dGVyKGkpKTsKICAgICAgIHRlc3RfY29tcGFyZSgwLDErMSwyLHNvbWVOdW1iZXJGb3JtYXR0ZXIoMSsxKSk7IAoKICAgTm90ZSB0aGF0IGluIHRoZSBzZWNvbmQgZXhhbXBsZSB0aGUgZXhwcmVzc2lvbiBpcyAwLCBiZWNhdXNlIHRoZSBmY24gcHJvZHVjZXMgaXQncyBvd24gcmVzdWx0LgoKICAgTWFjcm8gaXMgdWdseSBidXQgbWFrZXMgdGhlIHRlc3RzIHByZXR0eS4KKi8KCiNkZWZpbmUgdGVzdF9jb21wYXJlKGV4cHJlc3Npb24sdGVzdCxleHBlY3RlZCxwcmludGFibGVSZXN1bHQpIFwKICAgIHsgXAogICAgICAgIGV4cHJlc3Npb247IFwKICAgICAgICBcCiAgICAgICAgaWYoKHRlc3QpICE9IChleHBlY3RlZCkpIFwKICAgICAgICAgICAgZXJybG4oIkZBSUw6ICIgKyBVbmljb2RlU3RyaW5nKCNleHByZXNzaW9uKSArICI7IC0+ICIgKyBwcmludGFibGVSZXN1bHQgKyAiXG4iICsgXAogICAgICAgICAgICAgICAgICAgICIgICAoIiArIFVuaWNvZGVTdHJpbmcoI3Rlc3QpICsgIiAhPSAiICsgVW5pY29kZVN0cmluZygjZXhwZWN0ZWQpICsgIikiICk7IFwKICAgICAgICBlbHNlIFwKICAgICAgICAgICAgbG9nbG4oVW5pY29kZVN0cmluZygjZXhwcmVzc2lvbikgKyAiIC0+ICIgKyBwcmludGFibGVSZXN1bHQgKyAiICgiICsgVW5pY29kZVN0cmluZygjdGVzdCkgKyAiKSIpOyBcCiAgICB9CgoKCgovKgogVXNhZ2U6CiAgICB0ZXN0X2Fzc2VydF9wcmludCggICAgVGVzdCAoc2hvdWxkIGJlIFRSVUUpLCAgcHJpbnRhYmxlICApCgogICBFeGFtcGxlOgogICAgICAgdGVzdF9hc3NlcnQoaT09MywgdG9TdHJpbmcoaSkpOwoKICAgdGhlIG1hY3JvIGlzIHVnbHkgYnV0IG1ha2VzIHRoZSB0ZXN0cyBwcmV0dHkuCiovCgojZGVmaW5lIHRlc3RfYXNzZXJ0X3ByaW50KHRlc3QscHJpbnQpIFwKICAgIHsgXAogICAgICAgIGlmKCEodGVzdCkpIFwKICAgICAgICAgICAgZXJybG4oIkZBSUw6ICIgKyBVbmljb2RlU3RyaW5nKCN0ZXN0KSArICIgd2FzIG5vdCB0cnVlLiIgKyAiLT4gIiArIFVuaWNvZGVTdHJpbmcocHJpbnQpICk7IFwKICAgICAgICBlbHNlIFwKICAgICAgICAgICAgbG9nbG4oIlBBU1M6IGFzc2VydGVkICIgKyBVbmljb2RlU3RyaW5nKCN0ZXN0KSArICItPiAiICsgVW5pY29kZVN0cmluZyhwcmludCkpOyBcCiAgICB9CgoKI2RlZmluZSB0ZXN0X2R1bXBMb2NhbGUobCkgeyBVbmljb2RlU3RyaW5nIHM7IGwuZ2V0TmFtZShzKTsgbG9nbG4oI2wgKyBVbmljb2RlU3RyaW5nKCIgPSAiKSArIHMpOyB9CgpMb2NhbGVUZXN0OjpMb2NhbGVUZXN0KCkKewogICAgc2V0VXBEYXRhVGFibGUoKTsKfQoKTG9jYWxlVGVzdDo6fkxvY2FsZVRlc3QoKQp7Cn0KCiNkZWZpbmUgQ0FTRShpZCx0ZXN0KSBjYXNlIGlkOiBuYW1lID0gI3Rlc3Q7IGlmIChleGVjKSB7IGxvZ2xuKCN0ZXN0ICItLS0iKTsgbG9nbG4oKFVuaWNvZGVTdHJpbmcpIiIpOyB0ZXN0KCk7IH0gYnJlYWs7Cgp2b2lkIExvY2FsZVRlc3Q6OnJ1bkluZGV4ZWRUZXN0KCBpbnQzMl90IGluZGV4LCBib29sX3QgZXhlYywgY2hhciogJm5hbWUsIGNoYXIqIHBhciApCnsKICAgIGlmIChleGVjKSBsb2dsbigiVGVzdFN1aXRlIExvY2FsZVRlc3Q6ICIpOwogICAgc3dpdGNoIChpbmRleCkgewogICAgICAgIGNhc2UgMDogbmFtZSA9ICJUZXN0QmFzaWNHZXR0ZXJzIjsgaWYgKGV4ZWMpIFRlc3RCYXNpY0dldHRlcnMoKTsgYnJlYWs7CiAgICAgICAgY2FzZSAxOiBuYW1lID0gIlRlc3RTaW1wbGVSZXNvdXJjZUluZm8iOyBpZiAoZXhlYykgVGVzdFNpbXBsZVJlc291cmNlSW5mbygpOyBicmVhazsKICAgICAgICBjYXNlIDI6IG5hbWUgPSAiVGVzdERpc3BsYXlOYW1lcyI7IGlmIChleGVjKSBUZXN0RGlzcGxheU5hbWVzKCk7IGJyZWFrOwogICAgICAgIGNhc2UgMzogbmFtZSA9ICJUZXN0U2ltcGxlT2JqZWN0U3R1ZmYiOyBpZiAoZXhlYykgVGVzdFNpbXBsZU9iamVjdFN0dWZmKCk7IGJyZWFrOwogICAgICAgIGNhc2UgNDogbmFtZSA9ICJUZXN0UE9TSVhQYXJzaW5nIjsgaWYgKGV4ZWMpIFRlc3RQT1NJWFBhcnNpbmcoKTsgYnJlYWs7CiAgICAgICAgY2FzZSA1OiBuYW1lID0gIlRlc3RHZXRBdmFpbGFibGVMb2NhbGVzIjsgaWYgKGV4ZWMpIFRlc3RHZXRBdmFpbGFibGVMb2NhbGVzKCk7IGJyZWFrOwogICAgICAgIGNhc2UgNjogbmFtZSA9ICJUZXN0RGF0YURpcmVjdG9yeSI7IGlmIChleGVjKSBUZXN0RGF0YURpcmVjdG9yeSgpOyBicmVhazsKCiAgICAgICAgQ0FTRSg3LCBUZXN0SVNPM0ZhbGxiYWNrKQogICAgICAgIENBU0UoOCwgVGVzdEdldExhbmdzQW5kQ291bnRyaWVzKQogICAgICAgIENBU0UoOSwgVGVzdDQxMjY4ODApCiAgICAgICAgQ0FTRSgxMCwgVGVzdEJ1ZzQxMzUzMTYpCiAgICAgICAgQ0FTRSgxMSwgVGVzdFNpbXBsZURpc3BsYXlOYW1lcykKICAgICAgICBDQVNFKDEyLCBUZXN0VW5pbnN0YWxsZWRJU08zTmFtZXMpCiAgICAgICAgQ0FTRSgxMywgVGVzdEF0eXBpY2FsTG9jYWxlcykKICAgICAgICBDQVNFKDE0LCBUZXN0VGhhaUN1cnJlbmN5Rm9ybWF0KQogICAgICAgIENBU0UoMTUsIFRlc3RFdXJvU3VwcG9ydCkKICAgICAgICBDQVNFKDE2LCBUZXN0VG9TdHJpbmcpCiAgICAgICAgQ0FTRSgxNywgVGVzdDQxMzk5NDApCiAgICAgICAgQ0FTRSgxOCwgVGVzdDQxNDM5NTEpCiAgICAgICAgQ0FTRSgxOSwgVGVzdDQxNDczMTUpCiAgICAgICAgQ0FTRSgyMCwgVGVzdDQxNDczMTcpCiAgICAgICAgQ0FTRSgyMSwgVGVzdDQxNDc1NTIpCiAgICAgICAgQ0FTRSgyMiwgVGVzdFZhcmlhbnRQYXJzaW5nKQogICAgICAgIENBU0UoMjMsIFRlc3Q0MTA1ODI4KQoKICAgICAgICBkZWZhdWx0OiBuYW1lID0gIiI7IGJyZWFrOyAvL25lZWRlZCB0byBlbmQgbG9vcAogICAgfQp9Cgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RCYXNpY0dldHRlcnMoKSB7CiAgICBVbmljb2RlU3RyaW5nICAgdGVtcDsKCiAgICBpbnQzMl90IGk7CiAgICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT0NBTEVTOyBpKyspIHsKICAgICAgICBMb2NhbGUgdGVzdExvY2FsZShkYXRhVGFibGVbTEFOR11baV0sIGRhdGFUYWJsZVtDVFJZXVtpXSwgZGF0YVRhYmxlW1ZBUl1baV0pOwogICAgICAgIGxvZ2xuKCJUZXN0aW5nICIgKyB0ZXN0TG9jYWxlLmdldE5hbWUodGVtcCkgKyAiLi4uIik7CgogICAgICAgIGlmICh0ZXN0TG9jYWxlLmdldExhbmd1YWdlKHRlbXApICE9IChkYXRhVGFibGVbTEFOR11baV0pKQogICAgICAgICAgICBlcnJsbigiICBMYW5ndWFnZSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbTEFOR11baV0pOwogICAgICAgIGlmICh0ZXN0TG9jYWxlLmdldENvdW50cnkodGVtcCkgIT0gKGRhdGFUYWJsZVtDVFJZXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIENvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW0NUUlldW2ldKTsKICAgICAgICBpZiAodGVzdExvY2FsZS5nZXRWYXJpYW50KHRlbXApICE9IChkYXRhVGFibGVbVkFSXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIFZhcmlhbnQgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW1ZBUl1baV0pOwogICAgICAgIGlmICh0ZXN0TG9jYWxlLmdldE5hbWUodGVtcCkgIT0gKGRhdGFUYWJsZVtOQU1FXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIExvY2FsZSBuYW1lIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbTkFNRV1baV0pOwogICAgfQoKICAgIGxvZ2xuKCJTYW1lIHRoaW5nIHdpdGhvdXQgdmFyaWFudCBjb2Rlcy4uLiIpOwogICAgZm9yIChpID0gMDsgaSA8PSBNQVhfTE9DQUxFUzsgaSsrKSB7CiAgICAgICAgTG9jYWxlIHRlc3RMb2NhbGUoZGF0YVRhYmxlW0xBTkddW2ldLCBkYXRhVGFibGVbQ1RSWV1baV0pOwogICAgICAgIGxvZ2xuKCJUZXN0aW5nICIgKyB0ZXN0TG9jYWxlLmdldE5hbWUodGVtcCkgKyAiLi4uIik7CgogICAgICAgIGlmICh0ZXN0TG9jYWxlLmdldExhbmd1YWdlKHRlbXApICE9IChkYXRhVGFibGVbTEFOR11baV0pKQogICAgICAgICAgICBlcnJsbigiICBMYW5ndWFnZSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbTEFOR11baV0pOwogICAgICAgIGlmICh0ZXN0TG9jYWxlLmdldENvdW50cnkodGVtcCkgIT0gKGRhdGFUYWJsZVtDVFJZXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIENvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW0NUUlldW2ldKTsKICAgICAgICBpZiAodGVzdExvY2FsZS5nZXRWYXJpYW50KHRlbXApLmxlbmd0aCgpICE9IDApCiAgICAgICAgICAgIGVycmxuKCIgIFZhcmlhbnQgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyBcIlwiIik7CiAgICB9CgoKICAgIC8vIE5PVEU6IFRoZXJlIHVzZWQgdG8gYmUgYSBzcGVjaWFsIHRlc3QgZm9yIGxvY2FsZSBuYW1lcyB0aGF0IGhhZCBsYW5ndWFnZSBvcgogICAgLy8gY291bnRyeSBjb2RlcyB0aGF0IHdlcmUgbG9uZ2VyIHRoYW4gdHdvIGxldHRlcnMuICBUaGUgbmV3IHZlcnNpb24gb2YgTG9jYWxlCiAgICAvLyBkb2Vzbid0IHN1cHBvcnQgYW55dGhpbmcgdGhhdCBpc24ndCBhbiBvZmZpY2lhbGx5IHJlY29nbml6ZWQgbGFuZ3VhZ2Ugb3IKICAgIC8vIGNvdW50cnkgY29kZSwgc28gd2Ugbm8gbG9uZ2VyIHN1cHBvcnQgdGhpcyBmZWF0dXJlLgp9Cgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RTaW1wbGVSZXNvdXJjZUluZm8oKSB7CiAgVW5pY29kZVN0cmluZyAgIHRlbXA7CiAgY2hhciAgICAgICAgICAgIHRlbXAyWzIwXTsKICAKICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPD0gTUFYX0xPQ0FMRVM7IGkrKykgewogICAgTG9jYWxlIHRlc3RMb2NhbGUoZGF0YVRhYmxlW0xBTkddW2ldLCBkYXRhVGFibGVbQ1RSWV1baV0sIGRhdGFUYWJsZVtWQVJdW2ldKTsKICAgIGxvZ2xuKCJUZXN0aW5nICIgKyB0ZXN0TG9jYWxlLmdldE5hbWUodGVtcCkgKyAiLi4uIik7CiAgICAKICAgIGlmICh0ZXN0TG9jYWxlLmdldElTTzNMYW5ndWFnZSh0ZW1wKSAhPSAoZGF0YVRhYmxlW0xBTkczXVtpXSkpCiAgICAgIGVycmxuKCIgIElTTy0zIGxhbmd1YWdlIGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wCiAgICAgICAgKyAiIHZlcnN1cyAiICsgZGF0YVRhYmxlW0xBTkczXVtpXSk7CiAgICBpZiAodGVzdExvY2FsZS5nZXRJU08zQ291bnRyeSh0ZW1wKSAhPSAoZGF0YVRhYmxlW0NUUlkzXVtpXSkpCiAgICAgIGVycmxuKCIgIElTTy0zIGNvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAKICAgICAgICArICIgdmVyc3VzICIgKyBkYXRhVGFibGVbQ1RSWTNdW2ldKTsKICAgIAogICAgc3ByaW50Zih0ZW1wMiwgIiV4IiwgdGVzdExvY2FsZS5nZXRMQ0lEKCkpOwogICAgaWYgKFVuaWNvZGVTdHJpbmcodGVtcDIpICE9IGRhdGFUYWJsZVtMQ0lEXVtpXSkKICAgICAgZXJybG4oKFVuaWNvZGVTdHJpbmcpIiAgTENJRCBtaXNtYXRjaDogIiArIChpbnQzMl90KXRlc3RMb2NhbGUuZ2V0TENJRCgpICsgIiB2ZXJzdXMgIgogICAgICAgICsgZGF0YVRhYmxlW0xDSURdW2ldKTsKICB9Cn0KCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3REaXNwbGF5TmFtZXMoKSAKewogICAgTG9jYWxlICBzYXZlRGVmYXVsdCA9IExvY2FsZTo6Z2V0RGVmYXVsdCgpOwogICAgTG9jYWxlICBlbXB0eSgiIiwgIiIpOwogICAgTG9jYWxlICBlbmdsaXNoKCJlbiIsICJVUyIpOwogICAgTG9jYWxlICBmcmVuY2goImZyIiwgIkZSIik7CiAgICBMb2NhbGUgIGNyb2F0aWFuKCJociIsICJIUiIpOwogICAgTG9jYWxlICBncmVlaygiZWwiLCAiR1IiKTsKICAgIFVFcnJvckNvZGUgZXJyID0gVV9aRVJPX0VSUk9SOwoKICAgIExvY2FsZTo6c2V0RGVmYXVsdChlbmdsaXNoLCBlcnIpOwogICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgZXJybG4oIkxvY2FsZTo6c2V0RGVmYXVsdCByZXR1cm5lZCBlcnJvciBjb2RlICIgKyAoaW50KWVycik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxvZ2xuKCJXaXRoIGRlZmF1bHQgPSBlbl9VUy4uLiIpOwogICAgbG9nbG4oIiAgSW4gZGVmYXVsdCBsb2NhbGUuLi4iKTsKICAgIGRvVGVzdERpc3BsYXlOYW1lcyhlbXB0eSwgRExBTkdfRU4sIEZBTFNFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGVuX1VTLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZW5nbGlzaCwgRExBTkdfRU4sIEZBTFNFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGZyX0ZSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZnJlbmNoLCBETEFOR19GUiwgRkFMU0UpOwogICAgbG9nbG4oIiAgSW4gbG9jYWxlID0gaHJfSFIuLi4iKTsKICAgIGRvVGVzdERpc3BsYXlOYW1lcyhjcm9hdGlhbiwgRExBTkdfSFIsIEZBTFNFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGVsX0dSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZ3JlZWssIERMQU5HX0VMLCBGQUxTRSk7CgogICAgTG9jYWxlOjpzZXREZWZhdWx0KGZyZW5jaCwgZXJyKTsKICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgIGVycmxuKCJMb2NhbGU6OnNldERlZmF1bHQgcmV0dXJuZWQgZXJyb3IgY29kZSAiICsgKGludCllcnIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsb2dsbigiV2l0aCBkZWZhdWx0ID0gZnJfRlIuLi4iKTsKICAgIGxvZ2xuKCIgIEluIGRlZmF1bHQgbG9jYWxlLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZW1wdHksIERMQU5HX0ZSLCBUUlVFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGVuX1VTLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZW5nbGlzaCwgRExBTkdfRU4sIFRSVUUpOwogICAgbG9nbG4oIiAgSW4gbG9jYWxlID0gZnJfRlIuLi4iKTsKICAgIGRvVGVzdERpc3BsYXlOYW1lcyhmcmVuY2gsIERMQU5HX0ZSLCBUUlVFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGhyX0hSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoY3JvYXRpYW4sIERMQU5HX0hSLCBUUlVFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGVsX0dSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZ3JlZWssIERMQU5HX0VMLCBUUlVFKTsKCiAgICBMb2NhbGU6OnNldERlZmF1bHQoc2F2ZURlZmF1bHQsIGVycik7CiAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICBlcnJsbigiTG9jYWxlOjpzZXREZWZhdWx0IHJldHVybmVkIGVycm9yIGNvZGUgIiArIChpbnQpZXJyKTsKICAgICAgICByZXR1cm47CiAgICB9Cn0KCi8qCiBVc2FnZToKICAgIHRlc3RfYXNzZXJ0KCAgICBUZXN0IChzaG91bGQgYmUgVFJVRSkgICkKCiAgIEV4YW1wbGU6CiAgICAgICB0ZXN0X2Fzc2VydChpPT0zKTsKCiAgIHRoZSBtYWNybyBpcyB1Z2x5IGJ1dCBtYWtlcyB0aGUgdGVzdHMgcHJldHR5LgoqLwoKI2RlZmluZSB0ZXN0X2Fzc2VydCh0ZXN0KSBcCiAgICB7IFwKICAgICAgICBpZighKHRlc3QpKSBcCiAgICAgICAgICAgIGVycmxuKCJGQUlMOiAiICsgVW5pY29kZVN0cmluZygjdGVzdCkgKyAiIHdhcyBub3QgdHJ1ZS4iICk7IFwKICAgICAgICBlbHNlIFwKICAgICAgICAgICAgbG9nbG4oIlBBU1M6IGFzc2VydGVkICIgKyBVbmljb2RlU3RyaW5nKCN0ZXN0KSApOyBcCiAgICB9Cgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RTaW1wbGVPYmplY3RTdHVmZigpIHsKICAgIExvY2FsZSAgdGVzdDEoImFhIiwgIkFBIik7CiAgICBMb2NhbGUgIHRlc3QyKCJhYSIsICJBQSIpOwogICAgTG9jYWxlICB0ZXN0Myh0ZXN0MSk7CiAgICBMb2NhbGUgIHRlc3Q0KCJ6eiIsICJaWiIpOwogICAgTG9jYWxlICB0ZXN0NSgiYWEiLCAiQUEiLCAiIik7IAogICAgTG9jYWxlICB0ZXN0NigiYWEiLCAiQUEiLCAiQW50YXJlcyIpOyAKICAgIExvY2FsZSAgdGVzdDcoImFhIiwgIkFBIiwgIkp1cGl0ZXIiKTsKCiAgICAvLyBub3cgbGlzdCB0aGVtIGFsbCBmb3IgZGVidWdnaW5nIHVzYWdlLgogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3QxKTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0Mik7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDMpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q0KTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0NSk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDYpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q3KQoKICAgIC8vIE1ha2Ugc3VyZSB0aGluZ3MgY29tcGFyZSB0byB0aGVtc2VsdmVzIQogICAgdGVzdF9hc3NlcnQodGVzdDEgPT0gdGVzdDEpOwogICAgdGVzdF9hc3NlcnQodGVzdDIgPT0gdGVzdDIpOwogICAgdGVzdF9hc3NlcnQodGVzdDMgPT0gdGVzdDMpOwogICAgdGVzdF9hc3NlcnQodGVzdDQgPT0gdGVzdDQpOwogICAgdGVzdF9hc3NlcnQodGVzdDUgPT0gdGVzdDUpOwogICAgdGVzdF9hc3NlcnQodGVzdDYgPT0gdGVzdDYpOwogICAgdGVzdF9hc3NlcnQodGVzdDcgPT0gdGVzdDcpOwoKICAgIC8vIG1ha2Ugc3VyZSB0aGluZ3MgYXJlIG5vdCBlcXVhbCB0byB0aGVtc2VsdmVzLgogICAgdGVzdF9hc3NlcnQoISh0ZXN0MSAhPSB0ZXN0MSkpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0MiAhPSB0ZXN0MikpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0MyAhPSB0ZXN0MykpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0NCAhPSB0ZXN0NCkpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0NSAhPSB0ZXN0NSkpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0NiAhPSB0ZXN0NikpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0NyAhPSB0ZXN0NykpOwoKICAgIC8vIG1ha2Ugc3VyZSB0aGluZ3MgdGhhdCBhcmUgZXF1YWwgdG8gZWFjaCBvdGhlciBkb24ndCBzaG93IHVwIGFzIHVuZXF1YWwuCiAgICB0ZXN0X2Fzc2VydCghKHRlc3QxICE9IHRlc3QyKSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QyICE9IHRlc3QxKSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QxICE9IHRlc3QzKSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QyICE9IHRlc3QzKSk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NSA9PSB0ZXN0MSk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiAhPSB0ZXN0Mik7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiAhPSB0ZXN0NSk7CgogICAgdGVzdF9hc3NlcnQodGVzdDYgIT0gdGVzdDcpOwoKICAgIC8vIHRlc3QgZm9yIHRoaW5ncyB0aGF0IHNob3VsZG4ndCBjb21wYXJlIGVxdWFsLgogICAgdGVzdF9hc3NlcnQoISh0ZXN0MSA9PSB0ZXN0NCkpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0MiA9PSB0ZXN0NCkpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0MyA9PSB0ZXN0NCkpOwoKICAgIC8vIHRlc3QgZm9yIGhhc2ggY29kZXMgdG8gYmUgdGhlIHNhbWUuCiAgICBpbnQzMl90IGhhc2gxID0gdGVzdDEuaGFzaENvZGUoKTsKICAgIGludDMyX3QgaGFzaDIgPSB0ZXN0Mi5oYXNoQ29kZSgpOwogICAgaW50MzJfdCBoYXNoMyA9IHRlc3QzLmhhc2hDb2RlKCk7CgogICAgdGVzdF9hc3NlcnQoaGFzaDEgPT0gaGFzaDIpOwogICAgdGVzdF9hc3NlcnQoaGFzaDEgPT0gaGFzaDMpOwogICAgdGVzdF9hc3NlcnQoaGFzaDIgPT0gaGFzaDMpOwoKICAgIC8vIHRlc3QgdGhhdCB0aGUgYXNzaWdubWVudCBvcGVyYXRvciB3b3Jrcy4KICAgIHRlc3Q0ID0gdGVzdDE7CiAgICBsb2dsbigidGVzdDQ9dGVzdDE7Iik7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDQpOwogICAgdGVzdF9hc3NlcnQodGVzdDQgPT0gdGVzdDQpOwoKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDEgIT0gdGVzdDQpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDIgIT0gdGVzdDQpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDMgIT0gdGVzdDQpKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3QxID09IHRlc3Q0KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q0ID09IHRlc3QxKTsKICAgIAogICAgLy8gdGVzdCBhc3NpZ25tZW50cyB3aXRoIGEgdmFyaWFudAogICAgbG9nbG4oInRlc3Q3ID0gdGVzdDYiKTsKICAgIHRlc3Q3ID0gdGVzdDY7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDcpOwogICAgdGVzdF9hc3NlcnQodGVzdDcgPT0gdGVzdDcpOwogICAgdGVzdF9hc3NlcnQodGVzdDcgPT0gdGVzdDYpOwogICAgdGVzdF9hc3NlcnQodGVzdDcgIT0gdGVzdDUpOwoKICAgIGxvZ2xuKCJ0ZXN0NiA9IHRlc3QxIik7CiAgICB0ZXN0Nj10ZXN0MTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0Nik7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiAhPSB0ZXN0Nyk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiA9PSB0ZXN0MSk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiA9PSB0ZXN0Nik7Cn0KCi8vIEEgY2xhc3Mgd2hpY2ggZXhwb3NlcyBjb25zdHJ1Y3RvcnMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlIFBPU0lYIHBhcnNpbmcgY29kZS4KY2xhc3MgUE9TSVhMb2NhbGUgOiBwdWJsaWMgTG9jYWxlCnsKcHVibGljOgogICAgUE9TSVhMb2NhbGUoY29uc3QgVW5pY29kZVN0cmluZyYgbCkKICAgICAgICA6TG9jYWxlKCkKICAgIHsKICAgICAgICBzZXRGcm9tUE9TSVhJRChsKTsKICAgIH0KICAgIFBPU0lYTG9jYWxlKGNvbnN0IGNoYXIgKmwpCiAgICAgICAgOkxvY2FsZSgpCiAgICB7CiAgICAgICAgc2V0RnJvbVBPU0lYSUQobCk7CiAgICB9Cn07Cgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RQT1NJWFBhcnNpbmcoKQp7CiAgICBQT1NJWExvY2FsZSAgdGVzdDEoImFiX0FCIik7CiAgICBQT1NJWExvY2FsZSAgdGVzdDIoVW5pY29kZVN0cmluZygiYWJfQUIiKSk7CiAgICBMb2NhbGUgIHRlc3QzKCJhYiIsIkFCIik7CgogICAgUE9TSVhMb2NhbGUgdGVzdDQoImFiX0FCX0FudGFyZXMiKTsKICAgIFBPU0lYTG9jYWxlIHRlc3Q1KFVuaWNvZGVTdHJpbmcoImFiX0FCX0FudGFyZXMiKSk7CiAgICBMb2NhbGUgIHRlc3Q2KCJhYiIsICJBQiIsICJBbnRhcmVzIik7IAoKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0MSk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDIpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3QzKTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0NCk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDUpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q2KTsKCiAgICB0ZXN0X2Fzc2VydCh0ZXN0MSA9PSB0ZXN0MSk7CgogICAgdGVzdF9hc3NlcnQodGVzdDEgPT0gdGVzdDIpOwogICAgdGVzdF9hc3NlcnQodGVzdDIgPT0gdGVzdDMpOwogICAgdGVzdF9hc3NlcnQodGVzdDMgPT0gdGVzdDEpOwoKICAgIHRlc3RfYXNzZXJ0KHRlc3Q0ID09IHRlc3Q1KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q1ID09IHRlc3Q2KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ID09IHRlc3Q0KTsKCiAgICB0ZXN0X2Fzc2VydCh0ZXN0MSAhPSB0ZXN0NCk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NSAhPSB0ZXN0Myk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NSAhPSB0ZXN0Mik7CgogICAgaW50MzJfdCBoYXNoMSA9IHRlc3QxLmhhc2hDb2RlKCk7CiAgICBpbnQzMl90IGhhc2gyID0gdGVzdDIuaGFzaENvZGUoKTsKICAgIGludDMyX3QgaGFzaDMgPSB0ZXN0My5oYXNoQ29kZSgpOwoKICAgIHRlc3RfYXNzZXJ0KGhhc2gxID09IGhhc2gyKTsKICAgIHRlc3RfYXNzZXJ0KGhhc2gyID09IGhhc2gzKTsKICAgIHRlc3RfYXNzZXJ0KGhhc2gzID09IGhhc2gxKTsKfQoKdm9pZCBMb2NhbGVUZXN0OjpUZXN0R2V0QXZhaWxhYmxlTG9jYWxlcygpCnsKICAgIGludDMyX3QgbG9jQ291bnQgPSAwOwogICAgY29uc3QgTG9jYWxlKiBsb2NMaXN0ID0gTG9jYWxlOjpnZXRBdmFpbGFibGVMb2NhbGVzKGxvY0NvdW50KTsKCiAgICBpZiAobG9jQ291bnQgPT0gMCkKICAgICAgICBlcnJsbigiZ2V0QXZhaWxhYmxlTG9jYWxlcygpIHJldHVybmVkIGFuIGVtcHR5IGxpc3QhIik7CiAgICBlbHNlIHsKICAgICAgICBsb2dsbihVbmljb2RlU3RyaW5nKCJOdW1iZXIgb2YgbG9jYWxlcyByZXR1cm5lZCA9ICIpICsgbG9jQ291bnQpOwogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGxvY0NvdW50OyArK2kpCiAgICAgICAgICAgIGxvZ2xuKGxvY0xpc3RbaV0uZ2V0TmFtZSh0ZW1wKSk7CiAgICB9CiAgICAvLyBJIGhhdmUgbm8gaWRlYSBob3cgdG8gdGVzdCB0aGlzIGZ1bmN0aW9uLi4uCn0KCi8vIFRoaXMgdGVzdCBpc24ndCBhcHBsaWNhYmxlIGFueW1vcmUgLSBnZXRJU08zTGFuZ3VhZ2UgaXMKLy8gaW5kZXBlbmRlbnQgb2YgdGhlIGRhdGEgZGlyZWN0b3J5CnZvaWQgTG9jYWxlVGVzdDo6VGVzdERhdGFEaXJlY3RvcnkoKQp7Ci8qCiAgICBjaGFyICAgICAgICAgICAgb2xkRGlyZWN0b3J5WzgwXTsKICAgIGNvbnN0IGNoYXIqICAgICB0ZW1wOwogICAgVUVycm9yQ29kZSAgICAgICBlcnIgPSBVX1pFUk9fRVJST1I7CiAgICBVbmljb2RlU3RyaW5nICAgdGVzdFZhbHVlOwoKICAgIHRlbXAgPSBMb2NhbGU6OmdldERhdGFEaXJlY3RvcnkoKTsKICAgIHN0cmNweShvbGREaXJlY3RvcnksIHRlbXApOwogICAgbG9nbG4oVW5pY29kZVN0cmluZygib2xkRGlyZWN0b3J5ID0gIikgKyBvbGREaXJlY3RvcnkpOwoKICAgIExvY2FsZSAgdGVzdChMb2NhbGU6OlVTKTsKICAgIHRlc3QuZ2V0SVNPM0xhbmd1YWdlKHRlc3RWYWx1ZSk7CiAgICBsb2dsbigiZmlyc3QgZmV0Y2ggb2YgbGFuZ3VhZ2UgcmV0cmlldmVkICIgKyB0ZXN0VmFsdWUpOwogICAgaWYgKHRlc3RWYWx1ZSAhPSAiZW5nIikKICAgICAgICBlcnJsbigiSW5pdGlhbCBjaGVjayBvZiBJU08zIGxhbmd1YWdlIGZhaWxlZDogZXhwZWN0ZWQgXCJlbmdcIiwgZ290IFwiIiArIHRlc3RWYWx1ZSArICJcIiIpOwoKICAgIHsKICAgICAgICBjaGFyICpwYXRoOwogICAgICAgIHBhdGg9SW50bFRlc3Q6OmdldFRlc3REaXJlY3RvcnkoKTsKICAgICAgICBMb2NhbGU6OnNldERhdGFEaXJlY3RvcnkoIHBhdGggKTsKICAgIH0KCiAgICB0ZXN0LmdldElTTzNMYW5ndWFnZSh0ZXN0VmFsdWUpOwogICAgbG9nbG4oInNlY29uZCBmZXRjaCBvZiBsYW5ndWFnZSByZXRyaWV2ZWQgIiArIHRlc3RWYWx1ZSk7CiAgICBpZiAodGVzdFZhbHVlICE9ICJ4eHgiKQogICAgICAgIGVycmxuKCJzZXREYXRhRGlyZWN0b3J5KCkgZmFpbGVkOiBleHBlY3RlZCBcInh4eFwiLCBnb3QgXCIiICsgdGVzdFZhbHVlICsgIlwiIik7CiAgICAKICAgIExvY2FsZTo6c2V0RGF0YURpcmVjdG9yeShvbGREaXJlY3RvcnkpOwogICAgdGVzdC5nZXRJU08zTGFuZ3VhZ2UodGVzdFZhbHVlKTsKICAgIGxvZ2xuKCJ0aGlyZCBmZXRjaCBvZiBsYW5ndWFnZSByZXRyaWV2ZWQgIiArIHRlc3RWYWx1ZSk7CiAgICBpZiAodGVzdFZhbHVlICE9ICJlbmciKQogICAgICAgIGVycmxuKCJnZXQvc2V0RGF0YURpcmVjdG9yeSgpIGZhaWxlZDogZXhwZWN0ZWQgXCJlbmdcIiwgZ290IFwiIiArIHRlc3RWYWx1ZSArICJcIiIpOwoqLwp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp2b2lkIExvY2FsZVRlc3Q6OmRvVGVzdERpc3BsYXlOYW1lcyhMb2NhbGUmIGluTG9jYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbXBhcmVJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbF90IGRlZmF1bHRJc0ZyZW5jaCkgewogICAgVW5pY29kZVN0cmluZyAgIHRlbXA7CiAgICAKICAgIGlmIChkZWZhdWx0SXNGcmVuY2ggJiYgTG9jYWxlOjpnZXREZWZhdWx0KCkuZ2V0TGFuZ3VhZ2UodGVtcCkgIT0gImZyIikKICAgICAgICBlcnJsbigiRGVmYXVsdCBsb2NhbGUgc2hvdWxkIGJlIEZyZW5jaCwgYnV0IGl0J3MgcmVhbGx5ICIgKyB0ZW1wKTsKICAgIGVsc2UgaWYgKCFkZWZhdWx0SXNGcmVuY2ggJiYgTG9jYWxlOjpnZXREZWZhdWx0KCkuZ2V0TGFuZ3VhZ2UodGVtcCkgIT0gImVuIikKICAgICAgICBlcnJsbigiRGVmYXVsdCBsb2NhbGUgc2hvdWxkIGJlIEVuZ2xpc2gsIGJ1dCBpdCdzIHJlYWxseSAiICsgdGVtcCk7CgogICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDw9IE1BWF9MT0NBTEVTOyBpKyspIHsKICAgICAgICBMb2NhbGUgdGVzdExvY2FsZShkYXRhVGFibGVbTEFOR11baV0sIGRhdGFUYWJsZVtDVFJZXVtpXSwgZGF0YVRhYmxlW1ZBUl1baV0pOwogICAgICAgIGxvZ2xuKCIgIFRlc3RpbmcgIiArIHRlc3RMb2NhbGUuZ2V0TmFtZSh0ZW1wKSArICIuLi4iKTsKCiAgICAgICAgVW5pY29kZVN0cmluZyAgdGVzdExhbmc7CiAgICAgICAgVW5pY29kZVN0cmluZyAgdGVzdEN0cnk7CiAgICAgICAgVW5pY29kZVN0cmluZyAgdGVzdFZhcjsKICAgICAgICBVbmljb2RlU3RyaW5nICB0ZXN0TmFtZTsKCiAgICAgICAgaWYgKGluTG9jYWxlID09IExvY2FsZSgiIiwgIiIsICIiKSkgewogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlMYW5ndWFnZSh0ZXN0TGFuZyk7CiAgICAgICAgICAgIHRlc3RMb2NhbGUuZ2V0RGlzcGxheUNvdW50cnkodGVzdEN0cnkpOwogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlWYXJpYW50KHRlc3RWYXIpOwogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlOYW1lKHRlc3ROYW1lKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRlc3RMb2NhbGUuZ2V0RGlzcGxheUxhbmd1YWdlKGluTG9jYWxlLCB0ZXN0TGFuZyk7CiAgICAgICAgICAgIHRlc3RMb2NhbGUuZ2V0RGlzcGxheUNvdW50cnkoaW5Mb2NhbGUsIHRlc3RDdHJ5KTsKICAgICAgICAgICAgdGVzdExvY2FsZS5nZXREaXNwbGF5VmFyaWFudChpbkxvY2FsZSwgdGVzdFZhcik7CiAgICAgICAgICAgIHRlc3RMb2NhbGUuZ2V0RGlzcGxheU5hbWUoaW5Mb2NhbGUsIHRlc3ROYW1lKTsKICAgICAgICB9CgogICAgICAgIFVuaWNvZGVTdHJpbmcgIGV4cGVjdGVkTGFuZzsKICAgICAgICBVbmljb2RlU3RyaW5nICBleHBlY3RlZEN0cnk7CiAgICAgICAgVW5pY29kZVN0cmluZyAgZXhwZWN0ZWRWYXI7CiAgICAgICAgVW5pY29kZVN0cmluZyAgZXhwZWN0ZWROYW1lOwoKICAgICAgICBleHBlY3RlZExhbmcgPSBkYXRhVGFibGVbY29tcGFyZUluZGV4XVtpXTsKICAgICAgICBpZiAoZXhwZWN0ZWRMYW5nLmxlbmd0aCgpID09IDAgJiYgZGVmYXVsdElzRnJlbmNoKQogICAgICAgICAgICBleHBlY3RlZExhbmcgPSBkYXRhVGFibGVbRExBTkdfRlJdW2ldOwogICAgICAgIGlmIChleHBlY3RlZExhbmcubGVuZ3RoKCkgPT0gMCkKICAgICAgICAgICAgZXhwZWN0ZWRMYW5nID0gZGF0YVRhYmxlW0RMQU5HX0VOXVtpXTsKCiAgICAgICAgZXhwZWN0ZWRDdHJ5ID0gZGF0YVRhYmxlW2NvbXBhcmVJbmRleCArIDFdW2ldOwogICAgICAgIGlmIChleHBlY3RlZEN0cnkubGVuZ3RoKCkgPT0gMCAmJiBkZWZhdWx0SXNGcmVuY2gpCiAgICAgICAgICAgIGV4cGVjdGVkQ3RyeSA9IGRhdGFUYWJsZVtEQ1RSWV9GUl1baV07CiAgICAgICAgaWYgKGV4cGVjdGVkQ3RyeS5sZW5ndGgoKSA9PSAwKQogICAgICAgICAgICBleHBlY3RlZEN0cnkgPSBkYXRhVGFibGVbRENUUllfRU5dW2ldOwoKICAgICAgICBleHBlY3RlZFZhciA9IGRhdGFUYWJsZVtjb21wYXJlSW5kZXggKyAyXVtpXTsKICAgICAgICBpZiAoZXhwZWN0ZWRWYXIubGVuZ3RoKCkgPT0gMCAmJiBkZWZhdWx0SXNGcmVuY2gpCiAgICAgICAgICAgIGV4cGVjdGVkVmFyID0gZGF0YVRhYmxlW0RWQVJfRlJdW2ldOwogICAgICAgIGlmIChleHBlY3RlZFZhci5sZW5ndGgoKSA9PSAwKQogICAgICAgICAgICBleHBlY3RlZFZhciA9IGRhdGFUYWJsZVtEVkFSX0VOXVtpXTsKCiAgICAgICAgZXhwZWN0ZWROYW1lID0gZGF0YVRhYmxlW2NvbXBhcmVJbmRleCArIDNdW2ldOwogICAgICAgIGlmIChleHBlY3RlZE5hbWUubGVuZ3RoKCkgPT0gMCAmJiBkZWZhdWx0SXNGcmVuY2gpCiAgICAgICAgICAgIGV4cGVjdGVkTmFtZSA9IGRhdGFUYWJsZVtETkFNRV9GUl1baV07CiAgICAgICAgaWYgKGV4cGVjdGVkTmFtZS5sZW5ndGgoKSA9PSAwKQogICAgICAgICAgICBleHBlY3RlZE5hbWUgPSBkYXRhVGFibGVbRE5BTUVfRU5dW2ldOwoKICAgICAgICBpZiAodGVzdExhbmcgIT0gZXhwZWN0ZWRMYW5nKQogICAgICAgICAgICBlcnJsbigiRGlzcGxheSBsYW5ndWFnZSBtaXNtYXRjaDogIiArIHRlc3RMYW5nICsgIiB2ZXJzdXMgIiArIGV4cGVjdGVkTGFuZyk7CiAgICAgICAgaWYgKHRlc3RDdHJ5ICE9IGV4cGVjdGVkQ3RyeSkKICAgICAgICAgICAgZXJybG4oIkRpc3BsYXkgY291bnRyeSBtaXNtYXRjaDogIiArIHRlc3RDdHJ5ICsgIiB2ZXJzdXMgIiArIGV4cGVjdGVkQ3RyeSk7CiAgICAgICAgaWYgKHRlc3RWYXIgIT0gZXhwZWN0ZWRWYXIpCiAgICAgICAgICAgIGVycmxuKCJEaXNwbGF5IHZhcmlhbnQgbWlzbWF0Y2g6ICIgKyB0ZXN0VmFyICsgIiB2ZXJzdXMgIiArIGV4cGVjdGVkVmFyKTsKICAgICAgICBpZiAodGVzdE5hbWUgIT0gZXhwZWN0ZWROYW1lKQogICAgICAgICAgICBlcnJsbigiRGlzcGxheSBuYW1lIG1pc21hdGNoOiAiICsgdGVzdE5hbWUgKyAiIHZlcnN1cyAiICsgZXhwZWN0ZWROYW1lKTsKICAgIH0KfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGFibGUgb2YgdmFsaWQgZGF0YQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVW5pY29kZVN0cmluZyoqIExvY2FsZVRlc3Q6OmRhdGFUYWJsZSA9IDA7CgpjaGFyKiByYXdEYXRhWzI3XVs3XSA9IHsKCiAgICAgICAgLy8gbGFuZ3VhZ2UgY29kZQogICAgICAgIHsgICAiZW4iLCAgICJmciIsICAgImhyIiwgICAiZWwiLCAgICJubyIsICAgIml0IiwgICAieHgiICAgIH0sCiAgICAgICAgLy8gY291bnRyeSBjb2RlCiAgICAgICAgeyAgICJVUyIsICAgIkZSIiwgICAiSFIiLCAgICJHUiIsICAgIk5PIiwgICAiIiwgICAgICJZWSIgICAgfSwKICAgICAgICAvLyB2YXJpYW50IGNvZGUKICAgICAgICB7ICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiTlkiLCAgICIiLCAgICAgIiIgICAgfSwKICAgICAgICAvLyBmdWxsIG5hbWUKICAgICAgICB7ICAgImVuX1VTIiwgICAgImZyX0ZSIiwgICAgImhyX0hSIiwgICAgImVsX0dSIiwgICAgIm5vX05PX05ZIiwgIml0IiwgICAieHhfWVkiICB9LAogICAgICAgIC8vIElTTy0zIGxhbmd1YWdlCiAgICAgICAgeyAgICJlbmciLCAgImZyYSIsICAiaHJ2IiwgICJlbGwiLCAgIm5vciIsICAiaXRhIiwgICIiICAgfSwKICAgICAgICAvLyBJU08tMyBjb3VudHJ5CiAgICAgICAgeyAgICJVU0EiLCAgIkZSQSIsICAiSFJWIiwgICJHUkMiLCAgIk5PUiIsICAiIiwgICAgICIiICAgfSwKICAgICAgICAvLyBMQ0lEIChub3QgY3VycmVudGx5IHB1YmxpYykKICAgICAgICB7ICAgIjQwOSIsICI0MGMiLCAiNDFhIiwgIjQwOCIsICI4MTQiLCAiIiwgICAgICIiICB9LAoKICAgICAgICAvLyBkaXNwbGF5IGxhbmdhZ2UgKEVuZ2xpc2gpCiAgICAgICAgeyAgICJFbmdsaXNoIiwgICJGcmVuY2giLCAgICJDcm9hdGlhbiIsICJHcmVlayIsICAgICJOb3J3ZWdpYW4iLCAgICAiSXRhbGlhbiIsICAieHgiIH0sCiAgICAgICAgLy8gZGlzcGxheSBjb3VudHJ5IChFbmdsaXNoKQogICAgICAgIHsgICAiVW5pdGVkIFN0YXRlcyIsICAgICJGcmFuY2UiLCAgICJDcm9hdGlhIiwgICJHcmVlY2UiLCAgICJOb3J3YXkiLCAgICIiLCAgICAgIllZIiB9LAogICAgICAgIC8vIGRpc3BsYXkgdmFyaWFudCAoRW5nbGlzaCkKICAgICAgICB7ICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiTnlub3JzayIsICAgIiIsICAgICAiIn0sCiAgICAgICAgLy97ICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiTlkiLCAgICIiLCAgICAgIiJ9LAogICAgICAgIC8vIGRpc3BsYXkgbmFtZSAoRW5nbGlzaCkKICAgICAgICAvLyBVcGRhdGVkIG5vX05PX05ZIEVuZ2xpc2ggZGlzcGxheSBuYW1lIGZvciBuZXcgcGF0dGVybi1iYXNlZCBhbGdvcml0aG0KICAgICAgICAvLyAocGFydCBvZiBFdXJvIHN1cHBvcnQpLgogICAgICAgIHsgICAiRW5nbGlzaCAoVW5pdGVkIFN0YXRlcykiLCAiRnJlbmNoIChGcmFuY2UpIiwgIkNyb2F0aWFuIChDcm9hdGlhKSIsICJHcmVlayAoR3JlZWNlKSIsICJOb3J3ZWdpYW4gKE5vcndheSwgTnlub3JzaykiLCAiSXRhbGlhbiIsICJ4eCAoWVkpIiB9LAogICAgICAgIC8veyAgICJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSIsICJGcmVuY2ggKEZyYW5jZSkiLCAiQ3JvYXRpYW4gKENyb2F0aWEpIiwgIkdyZWVrIChHcmVlY2UpIiwgIk5vcndlZ2lhbiAoTm9yd2F5LE5ZKSIsICJJdGFsaWFuIiwgInh4IChZWSkiIH0sCgogICAgICAgIC8vIGRpc3BsYXkgbGFuZ2FnZSAoRnJlbmNoKQogICAgICAgIHsgICAiYW5nbGFpcyIsICAiZnJhblxcdTAwRTdhaXMiLCAgICIiLCAiZ3JlYyIsICAgICJub3J2XFx1MDBFOWdpZW4iLCAgICAiaXRhbGllbiIsICJ4eCIgfSwKICAgICAgICAvLyBkaXNwbGF5IGNvdW50cnkgKEZyZW5jaCkKICAgICAgICB7ICAgIlxcdTAwQzl0YXRzLVVuaXMiLCAgICAiRnJhbmNlIiwgICAiIiwgICJHclxcdTAwRThjZSIsICAgIk5vcnZcXHUwMEU4Z2UiLCAiIiwgICAgICJZWSIgfSwKICAgICAgICAvLyBkaXNwbGF5IHZhcmlhbnQgKEZyZW5jaCkKICAgICAgICB7ICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiTnlub3JzayIsICAgICAiIiwgICAgICIiIH0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lIChGcmVuY2gpCiAgICAgICAgLy97ICAgImFuZ2xhaXMgKMl0YXRzLVVuaXMpIiwgImZyYW7nYWlzIChGcmFuY2UpIiwgIiIsICJncmVjIChHcuhjZSkiLCAibm9ydulnaWVuIChOb3J26GdlLE55bm9yc2spIiwgIml0YWxpZW4iLCAieHggKFlZKSIgfSwKICAgICAgICB7ICAgImFuZ2xhaXMgKFxcdTAwQzl0YXRzLVVuaXMpIiwgImZyYW5cXHUwMEU3YWlzIChGcmFuY2UpIiwgIiIsICJncmVjIChHclxcdTAwRThjZSkiLCAibm9ydlxcdTAwRTlnaWVuIChOb3J2XFx1MDBFOGdlLCBOeW5vcnNrKSIsICJpdGFsaWVuIiwgInh4IChZWSkiIH0sCgogICAgICAgIC8vIGRpc3BsYXkgbGFuZ2FnZSAoQ3JvYXRpYW4pCiAgICAgICAgeyAgICIiLCAgIiIsICJocnZhdHNraSIsICIiLCAgICAiIiwgIiIsICJ4eCIgfSwKICAgICAgICAvLyBkaXNwbGF5IGNvdW50cnkgKENyb2F0aWFuKQogICAgICAgIHsgICAiIiwgICAgIiIsICAgIkhydmF0c2thIiwgICIiLCAgICIiLCAiIiwgIllZIiB9LAogICAgICAgIC8vIGRpc3BsYXkgdmFyaWFudCAoQ3JvYXRpYW4pCiAgICAgICAgeyAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICIiLCAiIn0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lIChDcm9hdGlhbikKICAgICAgICB7ICAgIiIsICIiLCAiaHJ2YXRza2kgKEhydmF0c2thKSIsICIiLCAiIiwgICIiLCAieHggKFlZKSIgfSwKCiAgICAgICAgLy8gZGlzcGxheSBsYW5nYWdlIChHcmVlaylbYWN0dWFsIHZhbHVlcyBsaXN0ZWQgYmVsb3ddCiAgICB7ICAgIiIsICAiIiwgIiIsICIiLCAgICAiIiwgIiIsICIiIH0sCiAgICAgICAgLy8gZGlzcGxheSBjb3VudHJ5IChHcmVlaylbYWN0dWFsIHZhbHVlcyBsaXN0ZWQgYmVsb3ddCiAgICB7ICAgIiIsICAiIiwgIiIsICIiLCAgICAiIiwgIiIsICIiIH0sCiAgICAgICAgLy8gZGlzcGxheSB2YXJpYW50IChHcmVlaykKICAgICAgICB7ICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgIiIsICIiIH0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lIChHcmVlaylbYWN0dWFsIHZhbHVlcyBsaXN0ZWQgYmVsb3ddCiAgICB7ICAgIiIsICAiIiwgIiIsICIiLCAgICAiIiwgIiIsICIiIH0sCgogICAgICAgIC8vIGRpc3BsYXkgbGFuZ2FnZSAoPHJvb3Q+KQogICAgICAgIHsgICAiRW5nbGlzaCIsICAiRnJlbmNoIiwgICAiQ3JvYXRpYW4iLCAiR3JlZWsiLCAgICAiTm9yd2VnaWFuIiwgICAgIkl0YWxpYW4iLCAgInh4IiB9LAogICAgICAgIC8vIGRpc3BsYXkgY291bnRyeSAoPHJvb3Q+KQogICAgICAgIHsgICAiVW5pdGVkIFN0YXRlcyIsICAgICJGcmFuY2UiLCAgICJDcm9hdGlhIiwgICJHcmVlY2UiLCAgICJOb3J3YXkiLCAgICIiLCAgICAgIllZIiB9LAogICAgICAgIC8vIGRpc3BsYXkgdmFyaWFudCAoPHJvb3Q+KQogICAgICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOeW5vcnNrIiwgICAiIiwgICAgICIifSwKICAgICAgICAvLyBkaXNwbGF5IG5hbWUgKDxyb290PikKICAgICAgICAvL3sgICAiRW5nbGlzaCAoVW5pdGVkIFN0YXRlcykiLCAiRnJlbmNoIChGcmFuY2UpIiwgIkNyb2F0aWFuIChDcm9hdGlhKSIsICJHcmVlayAoR3JlZWNlKSIsICJOb3J3ZWdpYW4gKE5vcndheSxOeW5vcnNrKSIsICJJdGFsaWFuIiwgInh4IChZWSkiIH0sCiAgICAgICAgeyAgICJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSIsICJGcmVuY2ggKEZyYW5jZSkiLCAiQ3JvYXRpYW4gKENyb2F0aWEpIiwgIkdyZWVrIChHcmVlY2UpIiwgIk5vcndlZ2lhbiAoTm9yd2F5LE5ZKSIsICJJdGFsaWFuIiwgInh4IChZWSkiIH0KfTsKClVDaGFyIGdyZWVrRGlzcGxheUxhbmd1YWdlW10gPSB7IDB4MDNiNSwgMHgwM2JiLCAweDAzYmIsIDB4MDNiNywgMHgwM2JkLCAweDAzYjksIDB4MDNiYSwgMHgwM2FjLCAwIH07ClVDaGFyIGdyZWVrRGlzcGxheUNvdW50cnlbXSA9IHsgMHgwMzk1LCAweDAzYmIsIDB4MDNiYiwgMHgwM2FjLCAweDAzYjQsIDB4MDNiMSwgMCB9OwpVQ2hhciBncmVla0Rpc3BsYXlOYW1lW10gPSB7IDB4MDNiNSwgMHgwM2JiLCAweDAzYmIsIDB4MDNiNywgMHgwM2JkLCAweDAzYjksIDB4MDNiYSwKICAgIDB4MDNhYywgMHgyMCwgMHgyOCwgMHgwMzk1LCAweDAzYmIsIDB4MDNiYiwgMHgwM2FjLCAweDAzYjQsIDB4MDNiMSwgMHgyOSwgMCB9OwogICAgCnZvaWQgTG9jYWxlVGVzdDo6c2V0VXBEYXRhVGFibGUoKQp7CiAgICBpZiAoZGF0YVRhYmxlID09IDApIHsKICAgICAgICBkYXRhVGFibGUgPSBuZXcgVW5pY29kZVN0cmluZypbMjddOwoKICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAyNzsgaSsrKSB7CiAgICAgICAgICAgIGRhdGFUYWJsZVtpXSA9IG5ldyBVbmljb2RlU3RyaW5nWzddOwogICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCA3OyBqKyspIHsKICAgICAgICAgICAgICAgIGRhdGFUYWJsZVtpXVtqXSA9IENoYXJzVG9Vbmljb2RlU3RyaW5nKHJhd0RhdGFbaV1bal0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRhdGFUYWJsZVtETEFOR19FTF1bR1JFRUtdID0gZ3JlZWtEaXNwbGF5TGFuZ3VhZ2U7CiAgICAgICAgZGF0YVRhYmxlW0RDVFJZX0VMXVtHUkVFS10gPSBncmVla0Rpc3BsYXlDb3VudHJ5OwogICAgICAgIGRhdGFUYWJsZVtETkFNRV9FTF1bR1JFRUtdID0gZ3JlZWtEaXNwbGF5TmFtZTsKICAgIH0KfQoKLy8gPT09PT09PT09PT09PT09PT09PT0KCgovKioKICogQGJ1ZyA0MDExNzU2IDQwMTEzODAKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RJU08zRmFsbGJhY2soKSAKewogICAgTG9jYWxlIHRlc3QoInh4IiwgIllZIik7CiAgICBib29sX3QgZ290RXhjZXB0aW9uID0gRkFMU0U7CiAgICBVbmljb2RlU3RyaW5nIHJlc3VsdDsKICAgIFVFcnJvckNvZGUgZXJyID0gVV9aRVJPX0VSUk9SOwoKICAgIC8vdHJ5IHsKICAgICAgICByZXN1bHQgPSB0ZXN0LmdldElTTzNMYW5ndWFnZShyZXN1bHQsIGVycik7CiAgICAvL30KICAgIC8vY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgaWYoVV9GQUlMVVJFKGVycikpCiAgICAgICAgICAgIGdvdEV4Y2VwdGlvbiA9IFRSVUU7CiAgICAvL30KICAgIGlmICghZ290RXhjZXB0aW9uKQogICAgICAgIGVycmxuKCJnZXRJU08zTGFuZ3VhZ2UoKSBvbiB4eF9ZWSByZXR1cm5lZCAiICsgcmVzdWx0ICsgIiBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGV4Y2VwdGlvbiIpOwoKICAgIGdvdEV4Y2VwdGlvbiA9IEZBTFNFOwogICAgZXJyID0gVV9aRVJPX0VSUk9SOwogICAgLy90cnkgewogICAgICAgIHJlc3VsdCA9IHRlc3QuZ2V0SVNPM0NvdW50cnkocmVzdWx0LCBlcnIpOwogICAgLy99CiAgICAvL2NhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewogICAgICAgIGlmKFVfRkFJTFVSRShlcnIpKQogICAgICAgICAgICBnb3RFeGNlcHRpb24gPSBUUlVFOwogICAgLy99CiAgICBpZiAoIWdvdEV4Y2VwdGlvbikKICAgICAgICBlcnJsbigiZ2V0SVNPM0NvdW50cnkoKSBvbiB4eF9ZWSByZXR1cm5lZCAiICsgcmVzdWx0ICsgIiBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGV4Y2VwdGlvbiIpOwp9CgovKioKICogQGJ1ZyA0MTA2MTU1IDQxMTg1ODcKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RHZXRMYW5nc0FuZENvdW50cmllcygpIAp7CiAgICAvLyBJdCBkaWRuJ3Qgc2VlbSByaWdodCB0byBqdXN0IGRvIGFuIGV4aGF1c3RpdmUgdGVzdCBvZiBldmVyeXRoaW5nIGhlcmUsIHNvIEkgY2hlY2sKICAgIC8vIGZvciB0aGUgZm9sbG93aW5nIHRoaW5nczoKICAgIC8vIDEpIERvZXMgZWFjaCBsaXN0IGhhdmUgdGhlIHJpZ2h0IHRvdGFsIG51bWJlciBvZiBlbnRyaWVzPwogICAgLy8gMikgRG9lcyBlYWNoIGxpc3QgY29udGFpbiBjZXJ0YWluIGxhbmd1YWdlIGFuZCBjb3VudHJ5IGNvZGVzIHdlIHRoaW5rIGFyZSBpbXBvcnRhbnQKICAgIC8vICAgICAodGhlIEc3IGNvdW50cmllcywgcGx1cyBhIGNvdXBsZSBvdGhlcnMpPwogICAgLy8gMykgRG9lcyBlYWNoIGxpc3QgaGF2ZSBldmVyeSBlbnRyeSBmb3JtYXR0ZWQgY29ycmVjdGx5PyAoaS5lLiwgdHdvIGNoYXJhY3RlcnMsCiAgICAvLyAgICAgYWxsIGxvd2VyIGNhc2UgZm9yIHRoZSBsYW5ndWFnZSBjb2RlcywgYWxsIHVwcGVyIGNhc2UgZm9yIHRoZSBjb3VudHJ5IGNvZGVzKQogICAgLy8gNCkgSXMgZWFjaCBsaXN0IGluIHNvcnRlZCBvcmRlcj8KICAgIGludDMyX3QgdGVzdENvdW50ID0gMDsKICAgIGNvbnN0IFVuaWNvZGVTdHJpbmcgKnRlc3QgPSBMb2NhbGU6OmdldElTT0xhbmd1YWdlcyh0ZXN0Q291bnQpOwogICAgVW5pY29kZVN0cmluZyBzcG90Q2hlY2sxIFtdID0geyAiZW4iLCAiZXMiLCAiZnIiLCAiZGUiLCAiaXQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphIiwgImtvIiwgInpoIiwgInRoIiwgImhlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCIsICJpdSIsICJ1ZyIsICJ5aSIsICJ6YSIgfTsKICAgIGludDMyX3Qgc3BvdExlbiA9IDE1OwoKICAgIGludDMyX3QgaTsKCiAgICBpZiAodGVzdENvdW50ICE9IDE0MikKICAgICAgICBlcnJsbigiRXhwZWN0ZWQgZ2V0SVNPTGFuZ3VhZ2VzKCkgdG8gcmV0dXJuIDE0MiBsYW5ndWFnZXM7IGl0IHJldHVybmVkIiArIHRlc3RDb3VudCk7CiAgICBlbHNlIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgewogICAgICAgICAgICBpbnQzMl90IGo7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0ZXN0Q291bnQ7IGorKykKICAgICAgICAgICAgICAgIGlmICh0ZXN0W2pdID09IHNwb3RDaGVjazFbaV0pCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGlmIChqID09IHRlc3RDb3VudCB8fCB0ZXN0W2pdICE9IHNwb3RDaGVjazFbaV0pCiAgICAgICAgICAgICAgICBlcnJsbigiQ291bGRuJ3QgZmluZCAiICsgc3BvdENoZWNrMVtpXSArICIgaW4gbGFuZ3VhZ2UgbGlzdC4iKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgdGVzdENvdW50OyBpKyspIHsKICAgICAgICBVbmljb2RlU3RyaW5nIGxjKHRlc3RbaV0pOwogICAgICAgIGlmICh0ZXN0W2ldICE9IGxjLnRvTG93ZXIoKSkKICAgICAgICAgICAgZXJybG4odGVzdFtpXSArICIgaXMgbm90IGFsbCBsb3dlciBjYXNlLiIpOwogICAgICAgIGlmICh0ZXN0W2ldLmxlbmd0aCgpICE9IDIpCiAgICAgICAgICAgIGVycmxuKHRlc3RbaV0gKyAiIGlzIG5vdCB0d28gY2hhcmFjdGVycyBsb25nLiIpOwogICAgICAgIGlmIChpID4gMCAmJiB0ZXN0W2ldLmNvbXBhcmUodGVzdFtpIC0gMV0pIDw9IDApCiAgICAgICAgICAgIGVycmxuKHRlc3RbaV0gKyAiIGFwcGVhcnMgaW4gYW4gb3V0LW9mLW9yZGVyIHBvc2l0aW9uIGluIHRoZSBsaXN0LiIpOwogICAgfQoKICAgIHRlc3QgPSBMb2NhbGU6OmdldElTT0NvdW50cmllcyh0ZXN0Q291bnQpOwogICAgVW5pY29kZVN0cmluZyBzcG90Q2hlY2syIFtdID0geyAiVVMiLCAiQ0EiLCAiR0IiLCAiRlIiLCAiREUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklUIiwgIkpQIiwgIktSIiwgIkNOIiwgIlRXIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSCIgfTsKICAgIGludDMyX3Qgc3BvdDJMZW4gPSAxMTsKCgogICAgaWYgKHRlc3RDb3VudCAhPSAyMzkpCiAgICAgICAgZXJybG4oIkV4cGVjdGVkIGdldElTT0xhbmd1YWdlcyB0byByZXR1cm4gMjM4IGxhbmd1YWdlczsgaXQgcmV0dXJuZWQiICsgdGVzdENvdW50KTsKICAgIGVsc2UgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcG90MkxlbjsgaSsrKSB7CiAgICAgICAgICAgIGludDMyX3QgajsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHRlc3RDb3VudDsgaisrKQogICAgICAgICAgICAgICAgaWYgKHRlc3Rbal0gPT0gc3BvdENoZWNrMltpXSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgaWYgKGogPT0gdGVzdENvdW50IHx8IHRlc3Rbal0gIT0gc3BvdENoZWNrMltpXSkKICAgICAgICAgICAgICAgIGVycmxuKCJDb3VsZG4ndCBmaW5kICIgKyBzcG90Q2hlY2syW2ldICsgIiBpbiBjb3VudHJ5IGxpc3QuIik7CiAgICAgICAgfQogICAgfQogICAgZm9yIChpID0gMDsgaSA8IHRlc3RDb3VudDsgaSsrKSB7CiAgICAgICAgVW5pY29kZVN0cmluZyB1Yyh0ZXN0W2ldKTsKICAgICAgICBpZiAodGVzdFtpXSAhPSB1Yy50b1VwcGVyKCkpCiAgICAgICAgICAgIGVycmxuKHRlc3RbaV0gKyAiIGlzIG5vdCBhbGwgdXBwZXIgY2FzZS4iKTsKICAgICAgICBpZiAodGVzdFtpXS5sZW5ndGgoKSAhPSAyKQogICAgICAgICAgICBlcnJsbih0ZXN0W2ldICsgIiBpcyBub3QgdHdvIGNoYXJhY3RlcnMgbG9uZy4iKTsKICAgICAgICBpZiAoaSA+IDAgJiYgdGVzdFtpXS5jb21wYXJlKHRlc3RbaSAtIDFdKSA8PSAwKQogICAgICAgICAgICBlcnJsbih0ZXN0W2ldICsgIiBhcHBlYXJzIGluIGFuIG91dC1vZi1vcmRlciBwb3NpdGlvbiBpbiB0aGUgbGlzdC4iKTsKICAgIH0KfQoKLyoqCiAqIEBidWcgNDEyNjg4MAogKi8KLy8gc2luY2UgdGhpcyByZXR1cm5zIGNvbnN0IFVuaWNvZGVTdHJpbmcqIGluIEMrKywgaXMgdGhpcyB0ZXN0IGFwcGxpY2FibGU/CnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3Q0MTI2ODgwKCkgCnsKICAgIC8qCiAgICBjb25zdCBVbmljb2RlU3RyaW5nICp0ZXN0OwogICAgaW50MzJfdCB0ZXN0Q291bnQ7CgogICAgdGVzdCA9IExvY2FsZTo6Z2V0SVNPQ291bnRyaWVzKHRlc3RDb3VudCk7CiAgICB0ZXN0WzBdID0gIlNVQ0tFUiEhISI7CiAgICB0ZXN0ID0gTG9jYWxlOjpnZXRJU09Db3VudHJpZXModGVzdENvdW50KTsKICAgIGlmICh0ZXN0WzBdID09ICJTVUNLRVIhISEiKQogICAgICAgIGVycmxuKCJDaGFuZ2VkIGludGVybmFsIGNvdW50cnkgY29kZSBsaXN0ISIpOwoKICAgIHRlc3QgPSBMb2NhbGU6OmdldElTT0xhbmd1YWdlcyh0ZXN0Q291bnQpOwogICAgdGVzdFswXSA9ICJIQUhBSEFIQSEhISI7CiAgICB0ZXN0ID0gTG9jYWxlOjpnZXRJU09MYW5ndWFnZXModGVzdENvdW50KTsKICAgIGlmICh0ZXN0WzBdID09ICJIQUhBSEFIQSEhISIpIC8vIEZpeGVkIHR5cG8KICAgICAgICBlcnJsbigiQ2hhbmdlcyBpbnRlcm5hbCBsYW5ndWFnZSBjb2RlIGxpc3QhIik7CiovCn0KCi8qKgogKiBAYnVnIDQxMzUzMTYKICovCi8vIG5vdCBhcHBsaWNhYmxlIGluIEMrKyAtIGNvbnN0IExvY2FsZSoKdm9pZCAKTG9jYWxlVGVzdDo6VGVzdEJ1ZzQxMzUzMTYoKSAKewovKgogICAgTG9jYWxlW10gbG9jYWxlczEgPSBMb2NhbGUuZ2V0QXZhaWxhYmxlTG9jYWxlcygpOwogICAgTG9jYWxlW10gbG9jYWxlczIgPSBMb2NhbGUuZ2V0QXZhaWxhYmxlTG9jYWxlcygpOwogICAgaWYgKGxvY2FsZXMxID09IGxvY2FsZXMyKQogICAgICAgIGVycmxuKCJMb2NhbGUuZ2V0QXZhaWxhYmxlTG9jYWxlcygpIGRvZXNuJ3QgY2xvbmUgaXRzIGludGVybmFsIHN0b3JhZ2UhIik7CiovCn0KCi8qKgogKiBAYnVnIDQxMDc5NTMKICovCi8qCnRlc3QgY29tbWVudGVkIG91dCBwZW5kaW5nIEFQSS1jaGFuZ2UgYXBwcm92YWwKcHVibGljIHZvaWQgVGVzdEdldExhbmd1YWdlc0ZvckNvdW50cnkoKSB7CiAgICBVbmljb2RlU3RyaW5nW10gbGFuZ3VhZ2VzID0gTG9jYWxlLmdldExhbmd1YWdlc0ZvckNvdW50cnkoIlVTIik7CgogICAgaWYgKCFzZWFyY2hTdHJpbmdBcnJheUZvcigiZW4iLCBsYW5ndWFnZXMpKQogICAgICAgIGVycmxuKCJEaWRuJ3QgZ2V0IGVuIGFzIGEgbGFuZ3VhZ2UgZm9yIFVTIik7CgogICAgbGFuZ3VhZ2VzID0gTG9jYWxlLmdldExhbmd1YWdlc0ZvckNvdW50cnkoIkZSIik7CiAgICBpZiAoIXNlYXJjaFN0cmluZ0FycmF5Rm9yKCJmciIsIGxhbmd1YWdlcykpCiAgICAgICAgZXJybG4oIkRpZG4ndCBnZXQgZnIgYXMgYSBsYW5ndWFnZSBmb3IgRlIiKTsKCiAgICBsYW5ndWFnZXMgPSBMb2NhbGUuZ2V0TGFuZ3VhZ2VzRm9yQ291bnRyeSgiQ0giKTsKICAgIGlmICghc2VhcmNoU3RyaW5nQXJyYXlGb3IoImZyIiwgbGFuZ3VhZ2VzKSkKICAgICAgICBlcnJsbigiRGlkbid0IGdldCBmciBhcyBhIGxhbmd1YWdlIGZvciBDSCIpOwogICAgaWYgKCFzZWFyY2hTdHJpbmdBcnJheUZvcigiaXQiLCBsYW5ndWFnZXMpKQogICAgICAgIGVycmxuKCJEaWRuJ3QgZ2V0IGl0IGFzIGEgbGFuZ3VhZ2UgZm9yIENIIik7CiAgICBpZiAoIXNlYXJjaFN0cmluZ0FycmF5Rm9yKCJkZSIsIGxhbmd1YWdlcykpCiAgICAgICAgZXJybG4oIkRpZG4ndCBnZXQgZGUgYXMgYSBsYW5ndWFnZSBmb3IgQ0giKTsKCiAgICBsYW5ndWFnZXMgPSBMb2NhbGUuZ2V0TGFuZ3VhZ2VzRm9yQ291bnRyeSgiSlAiKTsKICAgIGlmICghc2VhcmNoU3RyaW5nQXJyYXlGb3IoImphIiwgbGFuZ3VhZ2VzKSkKICAgICAgICBlcnJsbigiRGlkbid0IGdldCBqYSBhcyBhIGxhbmd1YWdlIGZvciBKUCIpOwp9CiovCgovKgpwcml2YXRlIGJvb2xfdCBzZWFyY2hTdHJpbmdBcnJheUZvcihVbmljb2RlU3RyaW5nIHMsIFVuaWNvZGVTdHJpbmdbXSBhcnJheSkgewogICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCiAgICAgICAgaWYgKHMuZXF1YWxzKGFycmF5W2ldKSkKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gRkFMU0U7Cn0KKi8KCi8qKgogKiBAYnVnIDQxMTA2MTMKICovCi8vIG5vdCBhcHBsaWNhYmxlIGluIEMrKwogLyoKdm9pZCAKTG9jYWxlVGVzdDo6VGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgT3B0aW9uYWxEYXRhRXhjZXB0aW9uLAogICAgICAgICAgICAgICAgSU9FeGNlcHRpb24sIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbgp7CiAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3N0cmVhbTsKICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvYnN0cmVhbTsKICAgIGJ5dGVbXSBieXRlcyA9IG51bGw7CgogICAgb2JzdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICBvc3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvYnN0cmVhbSk7CgogICAgTG9jYWxlIHRlc3QxID0gbmV3IExvY2FsZSgiemgiLCAiVFciLCAiIik7CiAgICBpbnQzMl90IGR1bW15ID0gdGVzdDEuaGFzaENvZGUoKTsgICAvLyBmaWxsIGluIHRoZSBjYWNoZWQgaGFzaC1jb2RlIHZhbHVlCiAgICBvc3RyZWFtLndyaXRlT2JqZWN0KHRlc3QxKTsKCiAgICBieXRlcyA9IG9ic3RyZWFtLnRvQnl0ZUFycmF5KCk7CgogICAgT2JqZWN0SW5wdXRTdHJlYW0gaXN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpKTsKCiAgICBMb2NhbGUgdGVzdDIgPSAoTG9jYWxlKShpc3RyZWFtLnJlYWRPYmplY3QoKSk7CgogICAgaWYgKCF0ZXN0MS5lcXVhbHModGVzdDIpIHx8IHRlc3QxLmhhc2hDb2RlKCkgIT0gdGVzdDIuaGFzaENvZGUoKSkKICAgICAgICBlcnJsbigiTG9jYWxlIGZhaWxlZCB0byBkZXNlcmlhbGl6ZSBjb3JyZWN0bHkuIik7Cn0KKi8KCi8qKgogKiBAYnVnIDQxMTg1ODcKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RTaW1wbGVEaXNwbGF5TmFtZXMoKSAKewogICAgLy8gVGhpcyB0ZXN0IGlzIGRpZmZlcmVudCBmcm9tIFRlc3REaXNwbGF5TmFtZXMgYmVjYXVzZSBUZXN0RGlzcGxheU5hbWVzIGNoZWNrcwogICAgLy8gZmFsbGJhY2sgYmVoYXZpb3IsIGNvbWJpbmF0aW9uIG9mIGxhbmd1YWdlIGFuZCBjb3VudHJ5IG5hbWVzIHRvIGZvcm0gbG9jYWxlCiAgICAvLyBuYW1lcywgYW5kIG90aGVyIHN0dWZmIGxpa2UgdGhhdC4gIFRoaXMgdGVzdCBqdXN0IGNoZWNrcyBzcGVjaWZpYyBsYW5ndWFnZQogICAgLy8gYW5kIGNvdW50cnkgY29kZXMgdG8gbWFrZSBzdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3QgbmFtZXMgZm9yIHRoZW0uCiAgICBVbmljb2RlU3RyaW5nIGxhbmd1YWdlQ29kZXMgW10gPSB7ICJoZSIsICJpZCIsICJpdSIsICJ1ZyIsICJ5aSIsICJ6YSIgfTsKICAgIFVuaWNvZGVTdHJpbmcgbGFuZ3VhZ2VOYW1lcyBbXSA9IHsgIkhlYnJldyIsICJJbmRvbmVzaWFuIiwgIkludWtpdHV0IiwgIlVpZ2h1ciIsICJZaWRkaXNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaaHVhbmciIH07CgogICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNjsgaSsrKSB7CiAgICAgICAgVW5pY29kZVN0cmluZyB0ZXN0OwogICAgICAgIExvY2FsZSBsKGxhbmd1YWdlQ29kZXNbaV0sICIiLCAiIik7CiAgICAgICAgbC5nZXREaXNwbGF5TGFuZ3VhZ2UoTG9jYWxlOjpVUywgdGVzdCk7CiAgICAgICAgaWYgKHRlc3QgIT0gbGFuZ3VhZ2VOYW1lc1tpXSkKICAgICAgICAgICAgZXJybG4oIkdvdCB3cm9uZyBkaXNwbGF5IG5hbWUgZm9yICIgKyBsYW5ndWFnZUNvZGVzW2ldICsgIjogRXhwZWN0ZWQgXCIiICsKICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VOYW1lc1tpXSArICJcIiwgZ290IFwiIiArIHRlc3QgKyAiXCIuIik7CiAgICB9Cn0KCi8qKgogKiBAYnVnIDQxMTg1OTUKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RVbmluc3RhbGxlZElTTzNOYW1lcygpIAp7CiAgICAvLyBUaGlzIHRlc3QgY2hlY2tzIHRvIG1ha2Ugc3VyZSBnZXRJU08zTGFuZ3VhZ2UgYW5kIGdldElTTzNDb3VudHJ5IHdvcmsgcmlnaHQKICAgIC8vIGV2ZW4gZm9yIGxvY2FsZXMgdGhhdCBhcmUgbm90IGluc3RhbGxlZC4KICAgIFVuaWNvZGVTdHJpbmcgaXNvMkxhbmd1YWdlcyBbXSA9IHsgICAgICJhbSIsICJiYSIsICJmeSIsICJtciIsICJybiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNzIiwgInR3IiwgInp1IiB9OwogICAgVW5pY29kZVN0cmluZyBpc28zTGFuZ3VhZ2VzIFtdID0geyAgICAgImFtaCIsICJiYWsiLCAiZnJ5IiwgIm1hciIsICJydW4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzc3ciLCAidHdpIiwgInp1bCIgfTsKCiAgICBpbnQzMl90IGk7CgogICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVzdDsKICAgICAgICBMb2NhbGUgbChpc28yTGFuZ3VhZ2VzW2ldLCAiIiwgIiIpOwogICAgICAgIGwuZ2V0SVNPM0xhbmd1YWdlKHRlc3QpOwogICAgICAgIGlmKHRlc3QgIT0gaXNvM0xhbmd1YWdlc1tpXSkKICAgICAgICAgICAgZXJybG4oIkdvdCB3cm9uZyBJU08zIGNvZGUgZm9yICIgKyBpc28yTGFuZ3VhZ2VzW2ldICsgIjogRXhwZWN0ZWQgXCIiICsKICAgICAgICAgICAgICAgICAgICBpc28zTGFuZ3VhZ2VzW2ldICsgIlwiLCBnb3QgXCIiICsgdGVzdCArICJcIi4iKTsKICAgIH0KCiAgICBVbmljb2RlU3RyaW5nIGlzbzJDb3VudHJpZXMgW10gPSB7ICAgICAiQUYiLCAiQlciLCAiS1oiLCAiTU8iLCAiTU4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTQiIsICJUQyIsICJaVyIgfTsKICAgIFVuaWNvZGVTdHJpbmcgaXNvM0NvdW50cmllcyBbXSA9IHsgICAgICJBRkciLCAiQldBIiwgIktBWiIsICJNQUMiLCAiTU5HIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0xCIiwgIlRDQSIsICJaV0UiIH07CgogICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVzdDsKICAgICAgICBMb2NhbGUgbCgiIiwgaXNvMkNvdW50cmllc1tpXSwgIiIpOwogICAgICAgIGwuZ2V0SVNPM0NvdW50cnkodGVzdCk7CiAgICAgICAgaWYgKHRlc3QgIT0gaXNvM0NvdW50cmllc1tpXSkKICAgICAgICAgICAgZXJybG4oIkdvdCB3cm9uZyBJU08zIGNvZGUgZm9yICIgKyBpc28yQ291bnRyaWVzW2ldICsgIjogRXhwZWN0ZWQgXCIiICsKICAgICAgICAgICAgICAgICAgICBpc28zQ291bnRyaWVzW2ldICsgIlwiLCBnb3QgXCIiICsgdGVzdCArICJcIi4iKTsKICAgIH0KfQoKLyoqCiAqIEBidWcgNDA5MjQ3NQogKiBJIGNvdWxkIG5vdCByZXByb2R1Y2UgdGhpcyBidWcuICBJJ20gcHJldHR5IGNvbnZpbmNlZCBpdCB3YXMgZml4ZWQgd2l0aCB0aGUKICogYmlnIGxvY2FsZS1kYXRhIHJlb3JnIG9mIDEwLzI4Lzk3LiAgVGhlIGxvb2t1cCBsb2dpYyBmb3IgbGFuZ3VhZ2UgYW5kIGNvdW50cnkKICogZGlzcGxheSBuYW1lcyB3YXMgYWxzbyBjaGFuZ2VkIGF0IHRoYXQgdGltZSBpbiB0aGF0IGNoZWNrLWluLiAgICAtLXJ0ZyAzLzIwLzk4CiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0QXR5cGljYWxMb2NhbGVzKCkgCnsKICAgIExvY2FsZSBsb2NhbGVzVG9UZXN0IFtdID0geyBMb2NhbGUoImRlIiwgIkNBIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoImphIiwgIlpBIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJydSIsICJNWCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgiZW4iLCAiRlIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoImVzIiwgIkRFIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCIiLCAiSFIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoIiIsICJTRSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgiIiwgIkRPIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCIiLCAiQkUiKSB9OwoKICAgIFVuaWNvZGVTdHJpbmcgZW5nbGlzaERpc3BsYXlOYW1lcyBbXSA9IHsgIkdlcm1hbiAoQ2FuYWRhKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmFwYW5lc2UgKFNvdXRoIEFmcmljYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJ1c3NpYW4gKE1leGljbykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2ggKEZyYW5jZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNwYW5pc2ggKEdlcm1hbnkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcm9hdGlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTd2VkZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvbWluaWNhbiBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmVsZ2l1bSIgfTsKICAgIFVuaWNvZGVTdHJpbmcgZnJlbmNoRGlzcGxheU5hbWVzIFtdPSB7ICJhbGxlbWFuZCAoQ2FuYWRhKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXBvbmFpcyAoU291dGggQWZyaWNhKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSdXNzaWFuIChNZXhpY28pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmdsYWlzIChGcmFuY2UpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlc3BhZ25vbCAoQWxsZW1hZ25lKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcm9hdGlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb1VuaWNvZGVTdHJpbmcoIlN1XFx1MDBFOGRlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb21pbmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmVsZ2lxdWUiIH07CiAgICBVbmljb2RlU3RyaW5nIHJ1cygiUnVzc2lhbiAoTSIpOwogICAgcnVzICs9IDB4MDBlOTsKICAgIHJ1cyArPSAieGljbykiOwoKICAgIFVuaWNvZGVTdHJpbmcgZXNwKCJlc3BhIik7CiAgICBlc3AgKz0gMHgwMGYxOwogICAgZXNwICs9ICJvbCAoR2VybWFueSkiOwoKICAgIFVuaWNvZGVTdHJpbmcgZHIoIlJlcCIpOwogICAgZHIgKz0gMHgwMGZhOwogICAgZHIgKz0gImJsaWNhIERvbWluaWNhbmEiOwoKICAgIFVuaWNvZGVTdHJpbmcgc3BhbmlzaERpc3BsYXlOYW1lcyBbXSA9IHsgIkdlcm1hbiAoQ2FuYWRhKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmFwYW5lc2UgKFNvdXRoIEFmcmljYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2ggKEZyYW5jZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyb2F0aWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN3ZWRlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCZWxnaXVtIiB9OwoKICAgIGludDMyX3QgaTsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgTG9jYWxlOjpzZXREZWZhdWx0KExvY2FsZTo6VVMsIHN0YXR1cyk7CiAgICBmb3IgKGkgPSAwOyBpIDwgOTsgKytpKSB7CiAgICAgICAgVW5pY29kZVN0cmluZyBuYW1lOwogICAgICAgIGxvY2FsZXNUb1Rlc3RbaV0uZ2V0RGlzcGxheU5hbWUoTG9jYWxlOjpVUywgbmFtZSk7CiAgICAgICAgbG9nbG4obmFtZSk7CiAgICAgICAgaWYgKG5hbWUgIT0gZW5nbGlzaERpc3BsYXlOYW1lc1tpXSkKICAgICAgICB7CiAgICAgICAgICAgIGVycmxuKCJMb29rdXAgaW4gRW5nbGlzaCBmYWlsZWQ6IGV4cGVjdGVkIFwiIiArIGVuZ2xpc2hEaXNwbGF5TmFtZXNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsIGdvdCBcIiIgKyBuYW1lICsgIlwiIik7CiAgICAgICAgICAgIGxvZ2xuKCJMb2NhbGUgbmFtZSB3YXMtPiAiICsgbG9jYWxlc1RvVGVzdFtpXS5nZXROYW1lKG5hbWUpKTsKICAgICAgICB9CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykgewogICAgICAgIFVuaWNvZGVTdHJpbmcgbmFtZTsKICAgICAgICBsb2NhbGVzVG9UZXN0W2ldLmdldERpc3BsYXlOYW1lKExvY2FsZSgiZXMiLCAiRVMiKSwgbmFtZSk7CiAgICAgICAgbG9nbG4obmFtZSk7CiAgICAgICAgaWYgKG5hbWUgIT0gc3BhbmlzaERpc3BsYXlOYW1lc1tpXSkKICAgICAgICAgICAgZXJybG4oIkxvb2t1cCBpbiBTcGFuaXNoIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgc3BhbmlzaERpc3BsYXlOYW1lc1tpXQogICAgICAgICAgICAgICAgICAgICAgICArICJcIiwgZ290IFwiIiArIG5hbWUgKyAiXCIiKTsKICAgIH0KCiAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CiAgICAgICAgVW5pY29kZVN0cmluZyBuYW1lOwogICAgICAgIGxvY2FsZXNUb1Rlc3RbaV0uZ2V0RGlzcGxheU5hbWUoTG9jYWxlOjpGUkFOQ0UsIG5hbWUpOwogICAgICAgIGxvZ2xuKG5hbWUpOwogICAgICAgIGlmIChuYW1lICE9IGZyZW5jaERpc3BsYXlOYW1lc1tpXSkKICAgICAgICAgICAgZXJybG4oIkxvb2t1cCBpbiBGcmVuY2ggZmFpbGVkOiBleHBlY3RlZCBcIiIgKyBmcmVuY2hEaXNwbGF5TmFtZXNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsIGdvdCBcIiIgKyBuYW1lICsgIlwiIik7CiAgICB9Cn0KCi8qKgogKiBAYnVnIDQxMjYzNzEKICovCi8vIG5vdCBhcHBsaWNhYmxlIGluIEMrKywgc2V0RGVmYXVsdCgpIHRha2VzIGEgcmVmZXJlbmNlCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3ROdWxsRGVmYXVsdCgpIAp7Ci8qCiAgICAvLyB3aHkgb24gZWFydGggYW55b25lIHdvdWxkIGV2ZXIgdHJ5IHRvIGRvIHRoaXMgaXMgYmV5b25kIG1lLCBidXQgd2Ugc2hvdWxkCiAgICAvLyBkZWZpbml0ZWx5IG1ha2Ugc3VyZSB3ZSBkb24ndCBsZXQgdGhlbQogICAgYm9vbF90IGdvdEV4Y2VwdGlvbiA9IEZBTFNFOwogICAgdHJ5IHsKICAgICAgICBMb2NhbGUuc2V0RGVmYXVsdChudWxsKTsKICAgIH0KICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CiAgICAgICAgLy8gYWxsIG90aGVyIGV4Y2VwdGlvbiB0eXBlcyBwcm9wYWdhdGUgdGhyb3VnaCBoZXJlIGJhY2sgdG8gdGhlIHRlc3QgaGFybmVzcwogICAgICAgIGdvdEV4Y2VwdGlvbiA9IFRSVUU7CiAgICB9CiAgICBpZiAoTG9jYWxlLmdldERlZmF1bHQoKSA9PSBudWxsKQogICAgICAgIGVycmxuKCJMb2NhbGUuZ2V0RGVmYXVsdCgpIGFsbG93ZWQgdXMgdG8gc2V0IGRlZmF1bHQgdG8gTlVMTCEiKTsKICAgIGlmICghZ290RXhjZXB0aW9uKQogICAgICAgIGVycmxuKCJUcnlpbmcgdG8gc2V0IGRlZmF1bHQgbG9jYWxlIHRvIE5VTEwgZGlkbid0IHRocm93IGV4Y2VwdGlvbiEiKTsKKi8KfQoKLyoqCiAqIEBidWcgNDEzNTc1MgogKiBUaGlzIHdvdWxkIGJlIGJldHRlciB0ZXN0ZWQgYnkgdGhlIExvY2FsZURhdGFUZXN0LiAgV2lsbCBtb3ZlIGl0IHdoZW4gSQogKiBnZXQgdGhlIExvY2FsZURhdGFUZXN0IHdvcmtpbmcgYWdhaW4uCiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0VGhhaUN1cnJlbmN5Rm9ybWF0KCkgCnsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgRGVjaW1hbEZvcm1hdCAqdGhhaUN1cnJlbmN5ID0gKERlY2ltYWxGb3JtYXQqKU51bWJlckZvcm1hdDo6Y3JlYXRlQ3VycmVuY3lJbnN0YW5jZSgKICAgICAgICAgICAgICAgICAgICBMb2NhbGUoInRoIiwgIlRIIiksIHN0YXR1cyk7CiAgICBVQ2hhciBwb3NQcmVmaXggPSAweDBlM2Y7CiAgICBVbmljb2RlU3RyaW5nIHRlbXA7CgogICAgaWYoVV9GQUlMVVJFKHN0YXR1cykgfHwgIXRoYWlDdXJyZW5jeSkKICAgIHsKICAgICAgICBlcnJsbigiQ291bGRuJ3QgZ2V0IHRoX1RIIGN1cnJlbmN5IC0+ICIgKyBVbmljb2RlU3RyaW5nKHVfZXJyb3JOYW1lKHN0YXR1cykpKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhhaUN1cnJlbmN5LT5nZXRQb3NpdGl2ZVByZWZpeCh0ZW1wKSAhPSBVbmljb2RlU3RyaW5nKCZwb3NQcmVmaXgsIDEsIDEpKQogICAgICAgIGVycmxuKCJUaGFpIGN1cnJlbmN5IHByZWZpeCB3cm9uZzogZXhwZWN0ZWQgMHgwZTNmLCBnb3QgXCIiICsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhaUN1cnJlbmN5LT5nZXRQb3NpdGl2ZVByZWZpeCh0ZW1wKSArICJcIiIpOwogICAgaWYgKHRoYWlDdXJyZW5jeS0+Z2V0UG9zaXRpdmVTdWZmaXgodGVtcCkgIT0gIiIpCiAgICAgICAgZXJybG4oIlRoYWkgY3VycmVuY3kgc3VmZml4IHdyb25nOiBleHBlY3RlZCBcIlwiLCBnb3QgXCIiICsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhaUN1cnJlbmN5LT5nZXRQb3NpdGl2ZVN1ZmZpeCh0ZW1wKSArICJcIiIpOwoKICAgIGRlbGV0ZSB0aGFpQ3VycmVuY3k7Cn0KCi8qKgogKiBAYnVnIDQxMjIzNzEKICogQ29uZmlybSB0aGF0IEV1cm8gc3VwcG9ydCB3b3Jrcy4gIFRoaXMgdGVzdCBpcyBwcmV0dHkgcnVkaW1lbnRhcnk7IGFsbCBpdCBkb2VzCiAqIGlzIGNoZWNrIHRoYXQgYW55IGxvY2FsZXMgd2l0aCB0aGUgRVVSTyB2YXJpYW50IGZvcm1hdCBhIG51bWJlciB1c2luZyB0aGUKICogRXVybyBjdXJyZW5jeSBzeW1ib2wuCiAqCiAqIEFTU1VNRTogQWxsIGxvY2FsZXMgZW5jb2RlIHRoZSBFdXJvIGNoYXJhY3RlciAiXHUyMEFDIi4KICogSWYgdGhpcyBpcyBjaGFuZ2VkIHRvIHVzZSB0aGUgc2luZ2xlLWNoYXJhY3RlciBFdXJvIHN5bWJvbCwgdGhpcwogKiB0ZXN0IG11c3QgYmUgdXBkYXRlZC4KICoKICogRE9OJ1QgQVNTVU1FOiBBbnkgc3BlY2lmaWMgY291bnRyaWVzIHN1cHBvcnQgdGhlIEV1cm8uICBJbnN0ZWFkLAogKiBpdGVyYXRlIHRocm91Z2ggYWxsIGxvY2FsZXMuCiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0RXVyb1N1cHBvcnQoKSAKewogICAgY29uc3QgVW5pY29kZVN0cmluZyBFVVJPX1ZBUklBTlQoIkVVUk8iKTsKICAgIFVDaGFyIGV1cm8gPSAweDIwYWM7CiAgICBjb25zdCBVbmljb2RlU3RyaW5nIEVVUk9fQ1VSUkVOQ1koJmV1cm8sIDEsIDEpOyAvLyBMb29rIGZvciB0aGlzIFVuaWNvZGVTdHJpbmcgaW4gZm9ybWF0dGVkIEV1cm8gY3VycmVuY3kKCiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKCiAgICBVbmljb2RlU3RyaW5nIHRlbXA7CgogICAgaW50MzJfdCBsb2NDb3VudCA9IDA7CiAgICBjb25zdCBMb2NhbGUgKmxvY2FsZXMgPSBOdW1iZXJGb3JtYXQ6OmdldEF2YWlsYWJsZUxvY2FsZXMobG9jQ291bnQpOyAgICAgIAogICAgZm9yIChpbnQzMl90IGk9MDsgaSA8IGxvY0NvdW50OyArK2kpIHsKICAgICAgICBMb2NhbGUgbG9jID0gbG9jYWxlc1tpXTsKICAgICAgICBVbmljb2RlU3RyaW5nIHRlbXA7CiAgICAgICAgaWYgKGxvYy5nZXRWYXJpYW50KHRlbXApLmluZGV4T2YoRVVST19WQVJJQU5UKSA+PSAwKSB7CiAgICAgICAgICAgIE51bWJlckZvcm1hdCAqbmYgPSBOdW1iZXJGb3JtYXQ6OmNyZWF0ZUN1cnJlbmN5SW5zdGFuY2UobG9jLCBzdGF0dXMpOwogICAgICAgICAgICBVbmljb2RlU3RyaW5nIHBvczsKICAgICAgICAgICAgbmYtPmZvcm1hdCgyNzE4MjguMTgyODQ1LCBwb3MpOwogICAgICAgICAgICBVbmljb2RlU3RyaW5nIG5lZzsKICAgICAgICAgICAgbmYtPmZvcm1hdCgtMjcxODI4LjE4Mjg0NSwgbmVnKTsKICAgICAgICAgICAgaWYgKHBvcy5pbmRleE9mKEVVUk9fQ1VSUkVOQ1kpID49IDAgJiYKICAgICAgICAgICAgICAgIG5lZy5pbmRleE9mKEVVUk9fQ1VSUkVOQ1kpID49IDApIHsKICAgICAgICAgICAgICAgIGxvZ2xuKCJPazogIiArIGxvYy5nZXROYW1lKHRlbXApICsKICAgICAgICAgICAgICAgICAgICAgICI6ICIgKyBwb3MgKyAiIC8gIiArIG5lZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBlcnJsbigiRmFpbDogIiArIGxvYy5nZXROYW1lKHRlbXApICsKICAgICAgICAgICAgICAgICAgICAgICIgZm9ybWF0cyB3aXRob3V0ICIgKyBFVVJPX0NVUlJFTkNZICsKICAgICAgICAgICAgICAgICAgICAgICI6ICIgKyBwb3MgKyAiIC8gIiArIG5lZyArCiAgICAgICAgICAgICAgICAgICAgICAiXG4qKiogVEhJUyBGQUlMVVJFIE1BWSBPTkxZIE1FQU4gVEhBVCBMT0NBTEUgREFUQSBIQVMgQ0hBTkdFRCAqKioiKTsKICAgICAgICAgICAgfQogICAgICAgIAogICAgICAgICAgICBkZWxldGUgbmY7CiAgICAgICAgfQogICAgfQp9CgovKioKICogQGJ1ZyA0MTM5NTA0CiAqIHRvU3RyaW5nKCkgZG9lc24ndCB3b3JrIHdpdGggbGFuZ3VhZ2VfVkFSSUFOVC4KICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RUb1N0cmluZygpIHsKICAgIExvY2FsZSBEQVRBIFtdID0gewogICAgICAgIExvY2FsZSgieHgiLCAiIiwgIiIpLAogICAgICAgIExvY2FsZSgiIiwgIllZIiwgIiIpLAogICAgICAgIExvY2FsZSgiIiwgIiIsICJaWiIpLAogICAgICAgIExvY2FsZSgieHgiLCAiWVkiLCAiIiksCiAgICAgICAgTG9jYWxlKCJ4eCIsICIiLCAiWloiKSwKICAgICAgICBMb2NhbGUoIiIsICJZWSIsICJaWiIpLAogICAgICAgIExvY2FsZSgieHgiLCAiWVkiLCAiWloiKSwKICAgIH07CgogICAgVW5pY29kZVN0cmluZyBEQVRBX1MgW10gPSB7CiAgICAgICAgInh4IiwKICAgICAgICAiX1lZIiwKICAgICAgICAiX19aWiIsCiAgICAgICAgInh4X1lZIiwKICAgICAgICAieHhfX1paIiwKICAgICAgICAiX1lZX1paIiwKICAgICAgICAieHhfWVlfWloiLAogICAgfTsKICAgIAogICAgZm9yIChpbnQzMl90IGk9MDsgaSA8IDc7ICsraSkgewogICAgICAgIFVuaWNvZGVTdHJpbmcgbmFtZTsKICAgICAgICBpZiAoREFUQVtpXS5nZXROYW1lKG5hbWUpICE9IERBVEFfU1tpXSkgewogICAgICAgICAgICBlcnJsbigiRmFpbDogTG9jYWxlLmdldE5hbWUoKSwgZ290OiIgKyBuYW1lICsgIiwgZXhwZWN0ZWQ6ICIgKyBEQVRBX1NbaV0pOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvZ2xuKCJQYXNzOiBMb2NhbGUuZ2V0TmFtZSgpLCBnb3Q6IiArIG5hbWUgKTsKICAgIH0KfQoKLyoqCiAqIEBidWcgNDEzOTk0MAogKiBDb3VsZG4ndCByZXByb2R1Y2UgdGhpcyBidWcgLS0gcHJvYmFibHkgd2FzIGZpeGVkIGVhcmxpZXIuCiAqCiAqIE9SSUdJTkFMIEJVRyBSRVBPUlQ6CiAqIC0tIGJhc2ljYWxseSwgaHVuZ2FyaWFuIGZvciBtb25kYXkgc2hvdWxkbid0IGhhdmUgYW4gXHUwMGY0IAogKiAobyBjaXJjdW1mbGV4KWluIGl0IGluc3RlYWQgaXQgc2hvdWxkIGJlIGFuIG8gd2l0aCAyIGluY2xpbmVkIAogKiAocmlnaHQpIGxpbmVzIG92ZXIgaXQuLgogKgogKiBZb3UgbWF5IHdvbmRlciAtLSB3aHkgZG8gYWxsIHRoaXMgLS0gd2h5IG5vdCBqdXN0IGFkZCBhIGxpbmUgdG8KICogTG9jYWxlRGF0YT8gIFdlbGwsIEkgY291bGQgc2VlIGJ5IGluc3BlY3Rpb24gdGhhdCB0aGUgbG9jYWxlIGZpbGUgaGFkIHRoZQogKiByaWdodCBjaGFyYWN0ZXIgaW4gaXQsIHNvIEkgd2FudGVkIHRvIGNoZWNrIHRoZSByZXN0IG9mIHRoZSBwaXBlbGluZSAtLSBhCiAqIHZlcnkgcmVtb3RlIHBvc3NpYmlsaXR5LCBidXQgSSB3YW50ZWQgdG8gYmUgc3VyZS4gIFRoZSBvdGhlciBwb3NzaWJpbGl0eQogKiBpcyB0aGF0IHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBmb250IG1hcHBpbmcgc3Vic3lzdGVtLCBidXQgd2UgY2FuJ3QKICogdGVzdCB0aGF0IGhlcmUuCiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0NDEzOTk0MCgpIAp7CiAgICBMb2NhbGUgbXlsb2NhbGUoImh1IiwgIiIsICIiKTsgICAgICAgCiAgICBVRGF0ZSBteWRhdGUgPSBkYXRlKDk4LDMsMTMpOyAvLyBBIE1vbmRheQogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAgICBTaW1wbGVEYXRlRm9ybWF0IGRmX2Z1bGwoIkVFRUUiLCBteWxvY2FsZSwgc3RhdHVzKTsKICAgIFVuaWNvZGVTdHJpbmcgc3RyOwogICAgRmllbGRQb3NpdGlvbiBwb3MoRmllbGRQb3NpdGlvbjo6RE9OVF9DQVJFKTsKICAgIGRmX2Z1bGwuZm9ybWF0KG15ZGF0ZSwgc3RyLCBwb3MpOwogICAgLy8gTWFrZSBzdXJlIHRoYXQgbyBjaXJjdW1mbGV4IChcdTAwRjQpIGlzIE5PVCB0aGVyZSwgYW5kCiAgICAvLyBvIGRvdWJsZSBhY3V0ZSAoXHUwMTUxKSBJUy4KICAgIFVDaGFyIG9jZiA9IDB4MDBmNDsKICAgIFVDaGFyIG9kYSA9IDB4MDE1MTsKICAgIGlmIChzdHIuaW5kZXhPZihvZGEpIDwgMCB8fCBzdHIuaW5kZXhPZihvY2YpID49IDApCiAgICAgICAgZXJybG4oIkZhaWw6IE1vbmRheSBpbiBIdW5nYXJpYW4gaXMgd3JvbmciKTsKfQoKVURhdGUKTG9jYWxlVGVzdDo6ZGF0ZShpbnQzMl90IHksIGludDMyX3QgbSwgaW50MzJfdCBkLCBpbnQzMl90IGhyLCBpbnQzMl90IG1pbiwgaW50MzJfdCBzZWMpCnsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgQ2FsZW5kYXIgKmNhbCA9IENhbGVuZGFyOjpjcmVhdGVJbnN0YW5jZShzdGF0dXMpOwogICAgaWYgKGNhbCA9PSAwKSAKICAgICAgICByZXR1cm4gMC4wOwogICAgY2FsLT5jbGVhcigpOwogICAgY2FsLT5zZXQoMTkwMCArIHksIG0sIGQsIGhyLCBtaW4sIHNlYyk7IC8vIEFkZCAxOTAwIHRvIGZvbGxvdyBqYXZhLnV0aWwuRGF0ZSBwcm90b2NvbAogICAgVURhdGUgZHQgPSBjYWwtPmdldFRpbWUoc3RhdHVzKTsKICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkKICAgICAgICByZXR1cm4gMC4wOwogICAgCiAgICBkZWxldGUgY2FsOwogICAgcmV0dXJuIGR0Owp9CgovKioKICogQGJ1ZyA0MTQzOTUxCiAqIFJ1c3NpYW4gZmlyc3QgZGF5IG9mIHdlZWsgc2hvdWxkIGJlIE1vbmRheS4gQ29uZmlybWVkLgogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdDQxNDM5NTEoKSAKewogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAgICBDYWxlbmRhciAqY2FsID0gQ2FsZW5kYXI6OmNyZWF0ZUluc3RhbmNlKExvY2FsZSgicnUiLCAiIiwgIiIpLCBzdGF0dXMpOwogICAgaWYgKGNhbC0+Z2V0Rmlyc3REYXlPZldlZWsoKSAhPSBDYWxlbmRhcjo6TU9OREFZKSB7CiAgICAgICAgZXJybG4oIkZhaWw6IEZpcnN0IGRheSBvZiB3ZWVrIGluIFJ1c3NpYSBzaG91bGQgYmUgTW9uZGF5Iik7CiAgICB9CiAgICBkZWxldGUgY2FsOwp9CgovKioKICogQGJ1ZyA0MTQ3MzE1CiAqIGphdmEudXRpbC5Mb2NhbGUuZ2V0SVNPM0NvdW50cnkoKSB3b3JrcyB3cm9uZyBmb3Igbm9uIElTTy0zMTY2IGNvZGVzLgogKiBTaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciB1bmtub3duIGxvY2FsZXMKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3Q0MTQ3MzE1KCkgCnsKICAgIC8vIFRyeSB3aXRoIGNvZGVzIHRoYXQgYXJlIHRoZSB3cm9uZyBsZW5ndGggYnV0IGhhcHBlbiB0byBtYXRjaCB0ZXh0CiAgICAvLyBhdCBhIHZhbGlkIG9mZnNldCBpbiB0aGUgbWFwcGluZyB0YWJsZQogICAgTG9jYWxlIGxvY2FsZSgiYWFhIiwgIkNDQyIpOwogICAgCiAgICAvL3RyeSB7CiAgICAgICAgVW5pY29kZVN0cmluZyByZXN1bHQ7CiAgICAgICAgVUVycm9yQ29kZSBlcnIgPSBVX1pFUk9fRVJST1I7CiAgICAgICAgbG9jYWxlLmdldElTTzNDb3VudHJ5KHJlc3VsdCwgZXJyKTsKCiAgICAgICAgVW5pY29kZVN0cmluZyB0ZW1wOwogICAgICAgIGlmKFVfU1VDQ0VTUyhlcnIpKQogICAgICAgICAgICBlcnJsbigiRVJST1I6IGdldElTTzNDb3VudHJ5KCkgcmV0dXJuczogIiArIHJlc3VsdCArIAogICAgICAgICAgICAgICAgIiBmb3IgbG9jYWxlICciICsgbG9jYWxlLmdldE5hbWUodGVtcCkgKyAiJyByYXRoZXIgdGhhbiBleGNlcHRpb24iICk7CiAgICAvL30gY2F0Y2goTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsgfQp9CgovKioKICogQGJ1ZyA0MTQ3MzE3CiAqIGphdmEudXRpbC5Mb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKCkgd29ya3Mgd3JvbmcgZm9yIG5vbiBJU08tMzE2NiBjb2Rlcy4KICogU2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBmb3IgdW5rbm93biBsb2NhbGVzCiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0NDE0NzMxNygpIAp7CiAgICAvLyBUcnkgd2l0aCBjb2RlcyB0aGF0IGFyZSB0aGUgd3JvbmcgbGVuZ3RoIGJ1dCBoYXBwZW4gdG8gbWF0Y2ggdGV4dAogICAgLy8gYXQgYSB2YWxpZCBvZmZzZXQgaW4gdGhlIG1hcHBpbmcgdGFibGUKICAgIExvY2FsZSBsb2NhbGUoImFhYSIsICJDQ0MiKTsKICAgIAogICAgLy90cnkgewogICAgICAgIFVuaWNvZGVTdHJpbmcgcmVzdWx0OwogICAgICAgIFVFcnJvckNvZGUgZXJyID0gVV9aRVJPX0VSUk9SOwogICAgICAgIGxvY2FsZS5nZXRJU08zTGFuZ3VhZ2UocmVzdWx0LCBlcnIpOwoKICAgICAgICBVbmljb2RlU3RyaW5nIHRlbXA7CiAgICAgICAgaWYoVV9TVUNDRVNTKGVycikpCiAgICAgICAgICAgIGVycmxuKCJFUlJPUjogZ2V0SVNPM0xhbmd1YWdlKCkgcmV0dXJuczogIiArIHJlc3VsdCArIAogICAgICAgICAgICAgICAiIGZvciBsb2NhbGUgJyIgKyBsb2NhbGUuZ2V0TmFtZSh0ZW1wKSArICInIHJhdGhlciB0aGFuIGV4Y2VwdGlvbiIgKTsKICAgIC8vfSBjYXRjaChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeyB9Cn0KCi8qCiAqIEBidWcgNDE0NzU1MgogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdDQxNDc1NTIoKSAKewogICAgTG9jYWxlIGxvY2FsZXMgW10gPSB7ICAgICBMb2NhbGUoIm5vIiwgIk5PIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJubyIsICJOTyIsICJCIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJubyIsICJOTyIsICJOWSIpIAogICAgfTsKICAgIAogICAgVW5pY29kZVN0cmluZyBlZG4oIk5vcndlZ2lhbiAoTm9yd2F5LCBCb2ttIik7CiAgICBlZG4gKz0gMHgwMGU1OwogICAgZWRuICs9ICJsKSI7CiAgICBVbmljb2RlU3RyaW5nIGVuZ2xpc2hEaXNwbGF5TmFtZXMgW10gPSB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9yd2VnaWFuIChOb3J3YXkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICJOb3J3ZWdpYW4gKE5vcndheSxCKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyJOb3J3ZWdpYW4gKE5vcndheSxOWSkiIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vcndlZ2lhbiAoTm9yd2F5LCBOeW5vcnNrKSIgCiAgICB9OwogICAgVW5pY29kZVN0cmluZyBuZG4oIm5vcnNrIChOb3JnZSwgQm9rbSIpOwogICAgbmRuICs9IDB4MDBlNTsKICAgIG5kbiArPSAibCkiOwogICAgVW5pY29kZVN0cmluZyBub3J3ZWdpYW5EaXNwbGF5TmFtZXMgW10gPSB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9yc2sgKE5vcmdlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIm5vcnNrIChOb3JnZSxCKSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG4sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ibm9yc2sgKE5vcmdlLE5ZKSIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9yc2sgKE5vcmdlLCBOeW5vcnNrKSIgCiAgICB9OwoKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgICAgIExvY2FsZSBsb2MgPSBsb2NhbGVzW2ldOwogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKICAgICAgICBpZiAobG9jLmdldERpc3BsYXlOYW1lKHRlbXApICE9IGVuZ2xpc2hEaXNwbGF5TmFtZXNbaV0pCiAgICAgICAgICAgZXJybG4oIkVuZ2xpc2ggZGlzcGxheS1uYW1lIG1pc21hdGNoOiBleHBlY3RlZCAiICsKICAgICAgICAgICAgICAgICAgIGVuZ2xpc2hEaXNwbGF5TmFtZXNbaV0gKyAiLCBnb3QgIiArIGxvYy5nZXREaXNwbGF5TmFtZSh0ZW1wKSk7CiAgICAgICAgaWYgKGxvYy5nZXREaXNwbGF5TmFtZShsb2MsIHRlbXApICE9IG5vcndlZ2lhbkRpc3BsYXlOYW1lc1tpXSkKICAgICAgICAgICAgZXJybG4oIk5vcndlZ2lhbiBkaXNwbGF5LW5hbWUgbWlzbWF0Y2g6IGV4cGVjdGVkICIgKwogICAgICAgICAgICAgICAgICAgbm9yd2VnaWFuRGlzcGxheU5hbWVzW2ldICsgIiwgZ290ICIgKwogICAgICAgICAgICAgICAgICAgbG9jLmdldERpc3BsYXlOYW1lKGxvYywgdGVtcCkpOwogICAgfQp9Cgp2b2lkCkxvY2FsZVRlc3Q6OlRlc3RWYXJpYW50UGFyc2luZygpCnsKICAgIExvY2FsZSBlbl9VU19jdXN0b20oImVuIiwgIlVTIiwgIkRlIEFuemFfQ3VwZXJ0aW5vX0NhbGlmb3JuaWFfVW5pdGVkIFN0YXRlc19FYXJ0aCIpOwoKICAgIFVuaWNvZGVTdHJpbmcgZGlzcE5hbWUoIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMsIERFIEFOWkFfQ1VQRVJUSU5PX0NBTElGT1JOSUFfVU5JVEVEIFNUQVRFU19FQVJUSCkiKTsKICAgIFVuaWNvZGVTdHJpbmcgZGlzcFZhcigiREUgQU5aQV9DVVBFUlRJTk9fQ0FMSUZPUk5JQV9VTklURUQgU1RBVEVTX0VBUlRIIik7CiAgICAKICAgIFVuaWNvZGVTdHJpbmcgZ290OwogICAgCiAgICBlbl9VU19jdXN0b20uZ2V0RGlzcGxheVZhcmlhbnQoTG9jYWxlOjpVUywgZ290KTsKICAgIGlmKGdvdCAhPSBkaXNwVmFyKSB7CiAgICAgICAgZXJybG4oIkZBSUw6IGdldERpc3BsYXlWYXJpYW50KCkiKTsKICAgICAgICBlcnJsbigiV2FudGVkOiAiICsgZGlzcFZhcik7CiAgICAgICAgZXJybG4oIkdvdCAgIDogIiArIGdvdCk7CiAgICB9CgogICAgZW5fVVNfY3VzdG9tLmdldERpc3BsYXlOYW1lKExvY2FsZTo6VVMsIGdvdCk7CiAgICBpZihnb3QgIT0gZGlzcE5hbWUpIHsKICAgICAgICBlcnJsbigiRkFJTDogZ2V0RGlzcGxheU5hbWUoKSIpOwogICAgICAgIGVycmxuKCJXYW50ZWQ6ICIgKyBkaXNwTmFtZSk7CiAgICAgICAgZXJybG4oIkdvdCAgIDogIiArIGdvdCk7CiAgICB9CgogICAgTG9jYWxlIHNob3J0VmFyaWFudCgiZnIiLCAiRlIiLCAiZm9vIik7CiAgICBzaG9ydFZhcmlhbnQuZ2V0RGlzcGxheVZhcmlhbnQoZ290KTsKICAgIAogICAgaWYoZ290ICE9ICJGT08iKSB7CiAgICAgICAgZXJybG4oIkZBSUw6IGdldERpc3BsYXlWYXJpYW50KCkiKTsKICAgICAgICBlcnJsbigiV2FudGVkOiBmb28iKTsKICAgICAgICBlcnJsbigiR290ICAgOiAiICsgZ290KTsKICAgIH0KCiAgICBMb2NhbGUgYm9ndXNWYXJpYW50KCJmciIsICJGUiIsICJfZm9vIik7CiAgICBib2d1c1ZhcmlhbnQuZ2V0RGlzcGxheVZhcmlhbnQoZ290KTsKICAgIAogICAgaWYoZ290ICE9ICJGT08iKSB7CiAgICAgICAgZXJybG4oIkZBSUw6IGdldERpc3BsYXlWYXJpYW50KCkiKTsKICAgICAgICBlcnJsbigiV2FudGVkOiBmb28iKTsKICAgICAgICBlcnJsbigiR290ICAgOiAiICsgZ290KTsKICAgIH0KCiAgICBMb2NhbGUgYm9ndXNWYXJpYW50MigiZnIiLCAiRlIiLCAiZm9vXyIpOwogICAgYm9ndXNWYXJpYW50Mi5nZXREaXNwbGF5VmFyaWFudChnb3QpOwogICAgCiAgICBpZihnb3QgIT0gIkZPTyIpIHsKICAgICAgICBlcnJsbigiRkFJTDogZ2V0RGlzcGxheVZhcmlhbnQoKSIpOwogICAgICAgIGVycmxuKCJXYW50ZWQ6IGZvbyIpOwogICAgICAgIGVycmxuKCJHb3QgICA6ICIgKyBnb3QpOwogICAgfQoKICAgIExvY2FsZSBib2d1c1ZhcmlhbnQzKCJmciIsICJGUiIsICJfZm9vXyIpOwogICAgYm9ndXNWYXJpYW50My5nZXREaXNwbGF5VmFyaWFudChnb3QpOwogICAgCiAgICBpZihnb3QgIT0gIkZPTyIpIHsKICAgICAgICBlcnJsbigiRkFJTDogZ2V0RGlzcGxheVZhcmlhbnQoKSIpOwogICAgICAgIGVycmxuKCJXYW50ZWQ6IGZvbyIpOwogICAgICAgIGVycmxuKCJHb3QgICA6ICIgKyBnb3QpOwogICAgfQp9CgovKioKICogQGJ1ZyA0MTA1ODI4CiAqIEN1cnJlbmN5IHN5bWJvbCBpbiB6aCBpcyB3cm9uZy4gIFdlIHdpbGwgdGVzdCB0aGlzIGF0IHRoZSBOdW1iZXJGb3JtYXQKICogZW5kIHRvIHRlc3QgdGhlIHdob2xlIHBpcGUuCiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0NDEwNTgyOCgpIAp7CiAgICBMb2NhbGUgTE9DIFtdID0geyBMb2NhbGU6OkNISU5FU0UsICBMb2NhbGUoInpoIiwgIkNOIiwgIiIpLAogICAgICAgICAgICAgICAgICAgICBMb2NhbGUoInpoIiwgIlRXIiwgIiIpLCBMb2NhbGUoInpoIiwgIkhLIiwgIiIpIH07CiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgIE51bWJlckZvcm1hdCAqZm10ID0gTnVtYmVyRm9ybWF0OjpjcmVhdGVQZXJjZW50SW5zdGFuY2UoTE9DW2ldLCBzdGF0dXMpOwogICAgICAgIGlmKFVfRkFJTFVSRShzdGF0dXMpKSB7CiAgICAgICAgICAgIGVycmxuKCJDb3VsZG4ndCBjcmVhdGUgTnVtYmVyRm9ybWF0Iik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgVW5pY29kZVN0cmluZyByZXN1bHQ7CiAgICAgICAgRmllbGRQb3NpdGlvbiBwb3MoMCk7CiAgICAgICAgZm10LT5mb3JtYXQoKGludDMyX3QpMSwgcmVzdWx0LCBwb3MpOwogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKICAgICAgICBpZihyZXN1bHQgIT0gIjEwMCUiKSB7CiAgICAgICAgICAgIGVycmxuKFVuaWNvZGVTdHJpbmcoIlBlcmNlbnQgZm9yICIpICsgTE9DW2ldLmdldERpc3BsYXlOYW1lKHRlbXApICsgIiBzaG91bGQgYmUgMTAwJSwgZ290ICIgKyByZXN1bHQpOwogICAgICAgIH0KICAgICAgICBkZWxldGUgZm10OwogICAgfQp9Cg==