ZnJvbSBSZXMgaW1wb3J0ICoKZnJvbSBSZXNvdXJjZXMgaW1wb3J0ICoKaW1wb3J0IE1hY09TCgpSRUFEID0gMQpXUklURSA9IDIKc21BbGxTY3JpcHRzID0gLTMKCmRlZiBjb3B5cmVzKHNyYywgZHN0KToKCSIiIkNvcHkgcmVzb3VyY2UgZnJvbSBzcmMgZmlsZSB0byBkc3QgZmlsZS4iIiIKCQoJY3VyID0gQ3VyUmVzRmlsZSgpCgljdG9yLCB0eXBlID0gTWFjT1MuR2V0Q3JlYXRvckFuZFR5cGUoc3JjKQoJaW5wdXQgPSBGU3BPcGVuUmVzRmlsZShzcmMsIFJFQUQpCgl0cnk6CgkJRlNwQ3JlYXRlUmVzRmlsZShkc3QsIGN0b3IsIHR5cGUsIHNtQWxsU2NyaXB0cykKCWV4Y2VwdDoKCQlyYXdfaW5wdXQoIiVzIGFscmVhZHkgZXhpc3RzLi4uICBDUiB0byB3cml0ZSBhbnl3YXkhICIgJSBkc3QpCglvdXRwdXQgPSBGU3BPcGVuUmVzRmlsZShkc3QsIFdSSVRFKQoJVXNlUmVzRmlsZShpbnB1dCkKCW50eXBlcyA9IENvdW50MVR5cGVzKCkKCWZvciBpdHlwZSBpbiByYW5nZSgxLCAxK250eXBlcyk6CgkJdHlwZSA9IEdldDFJbmRUeXBlKGl0eXBlKQoJCW5yZXNvdXJjZXMgPSBDb3VudDFSZXNvdXJjZXModHlwZSkKCQlmb3IgaXJlcyBpbiByYW5nZSgxLCAxK25yZXNvdXJjZXMpOgoJCQlyZXMgPSBHZXQxSW5kUmVzb3VyY2UodHlwZSwgaXJlcykKCQkJcmVzLkxvYWRSZXNvdXJjZSgpCgkJCWlkLCB0eXBlLCBuYW1lID0gcmVzLkdldFJlc0luZm8oKQoJCQlzaXplID0gcmVzLlNpemVSZXNvdXJjZSgpCgkJCWF0dHJzID0gcmVzLkdldFJlc0F0dHJzKCkKCQkJcHJpbnQgaWQsIHR5cGUsIG5hbWUsIHNpemUsIGhleChhdHRycykKCQkJcmVzLkRldGFjaFJlc291cmNlKCkKCQkJVXNlUmVzRmlsZShvdXRwdXQpCgkJCXRyeToKCQkJCXJlczIgPSBHZXQxUmVzb3VyY2UodHlwZSwgaWQpCgkJCWV4Y2VwdCAoUnVudGltZUVycm9yLCBSZXMuRXJyb3IpLCBtc2c6CgkJCQlyZXMyID0gTm9uZQoJCQlpZiByZXMyOgoJCQkJcHJpbnQgIkR1cGxpY2F0ZSB0eXBlK2lkLCBub3QgY29waWVkIgoJCQkJcHJpbnQgKHJlczIuc2l6ZSwgcmVzMi5kYXRhKQoJCQkJcHJpbnQgcmVzMi5HZXRSZXNJbmZvKCkKCQkJCWlmIHJlczIuSG9tZVJlc0ZpbGUoKSA9PSBvdXRwdXQ6CgkJCQkJJ09LJwoJCQkJZWxpZiByZXMyLkhvbWVSZXNGaWxlKCkgPT0gaW5wdXQ6CgkJCQkJJ0JBRCEnCgkJCQllbHNlOgoJCQkJCXByaW50ICdIb21lOicsIHJlczIuSG9tZVJlc0ZpbGUoKQoJCQllbHNlOgoJCQkJcmVzLkFkZFJlc291cmNlKHR5cGUsIGlkLCBuYW1lKQoJCQkJI3Jlcy5TZXRSZXNBdHRycyhhdHRycykKCQkJCXJlcy5Xcml0ZVJlc291cmNlKCkKCQkJVXNlUmVzRmlsZShpbnB1dCkKCVVzZVJlc0ZpbGUoY3VyKQoJQ2xvc2VSZXNGaWxlKG91dHB1dCkKCUNsb3NlUmVzRmlsZShpbnB1dCkKCmNvcHlyZXMoJzo6cHl0aG9uLrkucnNyYycsICc6OmZvby5yc3JjJykK