LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKLy8gTUFSS0VSKHVwZGF0ZV9wcmVjb21wLnB5KTogYXV0b2dlbiBpbmNsdWRlIHN0YXRlbWVudCwgZG8gbm90IHJlbW92ZQojaW5jbHVkZSAicHJlY29tcGlsZWRfYmFzaWMuaHh4IgoKI2luY2x1ZGUgInNiY29tcC5oeHgiCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaWYgZGVmaW5lZCBVTlgKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZWxzZQojaW5jbHVkZSA8bWF0aC5oPiAgIC8vIGF0b2YoKQojZW5kaWYKI2luY2x1ZGUgPHJ0bC9tYXRoLmh4eD4KI2luY2x1ZGUgPHZjbC9zdmFwcC5oeHg+CiNpbmNsdWRlIDx1bm90b29scy9jaGFyY2xhc3MuaHh4PgoKI2luY2x1ZGUgPHJ1bnRpbWUuaHh4PgoKU2JpU2Nhbm5lcjo6U2JpU2Nhbm5lciggY29uc3QgOjpydGw6Ok9VU3RyaW5nJiByQnVmLCBTdGFyQkFTSUMqIHAgKSA6IGFCdWYoIHJCdWYgKQp7CglwQmFzaWMgICA9IHA7CglwTGluZSAgICA9IE5VTEw7CgluVmFsCSA9IDA7CgllU2NhblR5cGUgPSBTYnhWQVJJQU5UOwoJbkVycm9ycyAgPSAwOwoJbkJ1ZlBvcyAgPSAwOwoJbkN1ckNvbDEgPSAwOwoJblNhdmVkQ29sMSA9IDA7CgluQ29sTG9jayA9IDA7CgluTGluZQkgPSAwOwoJbkNvbDEJID0gMDsKCW5Db2wyCSA9IDA7CgluQ29sICAgICA9IDA7CgliRXJyb3IJID0KCWJBYm9ydCAgID0KCWJTcGFjZXMgID0KCWJOdW1iZXIgID0KCWJTeW1ib2wgID0KCWJVc2VkRm9ySGlsaXRlID0KCWJDb21wYXRpYmxlID0gCgliVkJBU3VwcG9ydE9uID0gCgliUHJldkxpbmVFeHRlbnRzQ29tbWVudCA9IHNhbF9GYWxzZTsKCWJIYXNoICAgID0KCWJFcnJvcnMgID0gc2FsX1RydWU7Cn0KClNiaVNjYW5uZXI6On5TYmlTY2FubmVyKCkKe30KCnZvaWQgU2JpU2Nhbm5lcjo6TG9ja0NvbHVtbigpCnsKCWlmKCAhbkNvbExvY2srKyApCgkJblNhdmVkQ29sMSA9IG5Db2wxOwp9Cgp2b2lkIFNiaVNjYW5uZXI6OlVubG9ja0NvbHVtbigpCnsKCWlmKCBuQ29sTG9jayApCgkJbkNvbExvY2stLTsKfQoKdm9pZCBTYmlTY2FubmVyOjpHZW5FcnJvciggU2JFcnJvciBjb2RlICkKewogICAgaWYoIEdldFNiRGF0YSgpLT5iQmxvY2tDb21waWxlckVycm9yICkKICAgIHsKICAgICAgICBiQWJvcnQgPSBzYWxfVHJ1ZTsKICAgICAgICByZXR1cm47CiAgICB9CglpZiggIWJFcnJvciAmJiBiRXJyb3JzICkKCXsKCQlzYWxfQm9vbCBiUmVzID0gc2FsX1RydWU7CgkJLy8gTnVyIGVpbmVuIEZlaGxlciBwcm8gU3RhdGVtZW50IHJlcG9ydGVuCgkJYkVycm9yID0gc2FsX1RydWU7CgkJaWYoIHBCYXNpYyApCgkJewoJCQkvLyBGYWxscyBFWFBFQ1RFRCBvZGVyIFVORVhQRUNURUQga29tbWVuIHNvbGx0ZSwgYmV6aWVodCBlcyBzaWNoCgkJCS8vIGltbWVyIGF1ZiBkYXMgbGV0enRlIFRva2VuLCBhbHNvIGRpZSBDb2wxIHVlYmVybmVobWVuCgkJCXNhbF91SW50MTYgbmMgPSBuQ29sTG9jayA/IG5TYXZlZENvbDEgOiBuQ29sMTsKCQkJc3dpdGNoKCBjb2RlICkKCQkJewoJCQkJY2FzZSBTYkVSUl9FWFBFQ1RFRDoKCQkJCWNhc2UgU2JFUlJfVU5FWFBFQ1RFRDoKCQkJCWNhc2UgU2JFUlJfU1lNQk9MX0VYUEVDVEVEOgoJCQkJY2FzZSBTYkVSUl9MQUJFTF9FWFBFQ1RFRDoKCQkJCQluYyA9IG5Db2wxOwoJCQkJCWlmKCBuYyA+IG5Db2wyICkgbkNvbDIgPSBuYzsKCQkJCQlicmVhazsKCQkJfQoJCQliUmVzID0gcEJhc2ljLT5DRXJyb3IoIGNvZGUsIGFFcnJvciwgbkxpbmUsIG5jLCBuQ29sMiApOwoJCX0KCQliQWJvcnQgfD0gIWJSZXMgfAoJCQkgKCBjb2RlID09IFNiRVJSX05PX01FTU9SWSB8fCBjb2RlID09IFNiRVJSX1BST0dfVE9PX0xBUkdFICk7Cgl9CglpZiggYkVycm9ycyApCgkJbkVycm9ycysrOwp9CgovLyBGYWxscyBzb2ZvcnQgZWluIERvcHBlbHB1bmt0IGZvbGd0LCB3aXJkIHNhbF9UcnVlIHp1cnVlY2tnZWxpZWZlcnQuCi8vIFdpcmQgdm9uIFNiaVRva2VuaXplcjo6TWF5QmVMYWJlbCgpIHZlcndlbmRldCwgdW0gZWluZW4gTGFiZWwgenUgZXJrZW5uZW4KCnNhbF9Cb29sIFNiaVNjYW5uZXI6OkRvZXNDb2xvbkZvbGxvdygpCnsKCWlmKCBwTGluZSAmJiAqcExpbmUgPT0gJzonICkKCXsKCQlwTGluZSsrOyBuQ29sKys7IHJldHVybiBzYWxfVHJ1ZTsKCX0KCWVsc2UgcmV0dXJuIHNhbF9GYWxzZTsKfQoKLy8gVGVzdGVuIGF1ZiBlaW4gbGVnYWxlcyBTdWZmaXgKCnN0YXRpYyBTYnhEYXRhVHlwZSBHZXRTdWZmaXhUeXBlKCBzYWxfVW5pY29kZSBjICkKewoJc3RhdGljIFN0cmluZyBhU3VmZml4ZXNTdHIgPSBTdHJpbmc6OkNyZWF0ZUZyb21Bc2NpaSggIiUmISNAICQiICk7CglpZiggYyApCgl7CgkJc2FsX3VJbnQzMiBuID0gYVN1ZmZpeGVzU3RyLlNlYXJjaCggYyApOwoJCWlmKCBTVFJJTkdfTk9URk9VTkQgIT0gbiAmJiBjICE9ICcgJyApCgkJCXJldHVybiBTYnhEYXRhVHlwZSggKHNhbF91SW50MTYpIG4gKyBTYnhJTlRFR0VSICk7Cgl9CglyZXR1cm4gU2J4VkFSSUFOVDsKfQoKLy8gRWlubGVzZW4gZGVzIG5hZWNoc3RlbiBTeW1ib2xzIGluIGRpZSBWYXJpYWJsZW4gYVN5bSwgblZhbCB1bmQgZVR5cGUKLy8gUmV0dXJud2VydCBpc3Qgc2FsX0ZhbHNlIGJlaSBFT0Ygb2RlciBGZWhsZXJuCiNkZWZpbmUgQlVGX1NJWkUgODAKCm5hbWVzcGFjZSB7CgovKiogUmV0dXJucyB0cnVlLCBpZiB0aGUgcGFzc2VkIGNoYXJhY3RlciBpcyBhIHdoaXRlIHNwYWNlIGNoYXJhY3Rlci4gKi8KaW5saW5lIGJvb2wgbGNsSXNXaGl0ZXNwYWNlKCBzYWxfVW5pY29kZSBjQ2hhciApCnsKICAgIHJldHVybiAoY0NoYXIgPT0gJyAnKSB8fCAoY0NoYXIgPT0gJ1x0JykgfHwgKGNDaGFyID09ICdcZicpOwp9Cgp9IC8vIG5hbWVzcGFjZQoKc2FsX0Jvb2wgU2JpU2Nhbm5lcjo6TmV4dFN5bSgpCnsKCS8vIEZ1ZXIgZGVuIEVPTE4tRmFsbCBtZXJrZW4KCXNhbF91SW50MTYgbk9sZExpbmUgPSBuTGluZTsKCXNhbF91SW50MTYgbk9sZENvbDEgPSBuQ29sMTsKCXNhbF91SW50MTYgbk9sZENvbDIgPSBuQ29sMjsKCXNhbF9Vbmljb2RlIGJ1ZlsgQlVGX1NJWkUgXSwgKnAgPSBidWY7CgliSGFzaCA9IHNhbF9GYWxzZTsKCgllU2NhblR5cGUgPSBTYnhWQVJJQU5UOwoJYVN5bS5FcmFzZSgpOwoJYlN5bWJvbCA9CgliTnVtYmVyID0gYlNwYWNlcyA9IHNhbF9GYWxzZTsKCgkvLyBaZWlsZSBlaW5sZXNlbj8KCWlmKCAhcExpbmUgKQoJewoJCXNhbF9JbnQzMiBuID0gbkJ1ZlBvczsKCQlzYWxfSW50MzIgbkxlbiA9IGFCdWYuZ2V0TGVuZ3RoKCk7CgkJaWYoIG5CdWZQb3MgPj0gbkxlbiApCgkJCXJldHVybiBzYWxfRmFsc2U7CgkJY29uc3Qgc2FsX1VuaWNvZGUqIHAyID0gYUJ1Zi5nZXRTdHIoKTsKCQlwMiArPSBuOwoJCXdoaWxlKCAoIG4gPCBuTGVuICkgJiYgKCAqcDIgIT0gJ1xuJyApICYmICggKnAyICE9ICdccicgKSApCgkJCXAyKyssIG4rKzsKICAgICAgICAvLyAjMTYzOTQ0IyBpZ25vcmUgdHJhaWxpbmcgd2hpdGVzcGFjZQogICAgICAgIHNhbF9JbnQzMiBuQ29weUVuZFBvcyA9IG47CiAgICAgICAgd2hpbGUoIChuQnVmUG9zIDwgbkNvcHlFbmRQb3MpICYmIGxjbElzV2hpdGVzcGFjZSggYUJ1ZlsgbkNvcHlFbmRQb3MgLSAxIF0gKSApCiAgICAgICAgICAgIC0tbkNvcHlFbmRQb3M7CgkJYUxpbmUgPSBhQnVmLmNvcHkoIG5CdWZQb3MsIG5Db3B5RW5kUG9zIC0gbkJ1ZlBvcyApOwoJCWlmKCBuIDwgbkxlbiApCiAgICAgICAgewoJCSAgICBpZiggKnAyID09ICdccicgJiYgKiggcDIrMSApID09ICdcbicgKQoJCQkgICAgbiArPSAyOwoJCSAgICBlbHNlCgkJCSAgICBuKys7CiAgICAgICAgfQoJCW5CdWZQb3MgPSBuOwogICAgICAgIHBMaW5lID0gYUxpbmUuZ2V0U3RyKCk7CgkJbk9sZExpbmUgPSArK25MaW5lOwoJCW5Db2wgPSBuQ29sMSA9IG5Db2wyID0gbk9sZENvbDEgPSBuT2xkQ29sMiA9IDA7CgkJbkNvbExvY2sgPSAwOwoJfQoKCS8vIExlZXJzdGVsbGVuIHdlZzoKCXdoaWxlKCBsY2xJc1doaXRlc3BhY2UoICpwTGluZSApICkKCQlwTGluZSsrLCBuQ29sKyssIGJTcGFjZXMgPSBzYWxfVHJ1ZTsKCgluQ29sMSA9IG5Db2w7CgoJLy8gbnVyIExlZXJ6ZWlsZT8KCWlmKCAhKnBMaW5lICkKCQlnb3RvIGVvbG47CgoJaWYoIGJQcmV2TGluZUV4dGVudHNDb21tZW50ICkKCQlnb3RvIFByZXZMaW5lQ29tbWVudExibDsKCglpZiggKnBMaW5lID09ICcjJyApCgl7CgkJcExpbmUrKzsKCQluQ29sKys7CgkJYkhhc2ggPSBzYWxfVHJ1ZTsKCX0KCgkvLyBTeW1ib2w/IERhbm4gWmVpY2hlbiBrb3BpZXJlbi4KICAgIGlmKCBCYXNpY1NpbXBsZUNoYXJDbGFzczo6aXNBbHBoYSggKnBMaW5lLCBiQ29tcGF0aWJsZSApIHx8ICpwTGluZSA9PSAnXycgKQoJewoJCS8vIFdlbm4gbmFjaCAnXycgbmljaHRzIGtvbW10LCBpc3QgZXMgZWluIFplaWxlbmFic2NobHVzcyEKCQlpZigJKnBMaW5lID09ICdfJyAmJiAhKihwTGluZSsxKSApCgkJewlwTGluZSsrOwoJCQlnb3RvIGVvbG47CX0KCQliU3ltYm9sID0gc2FsX1RydWU7CgkJc2hvcnQgbiA9IG5Db2w7CgkJZm9yICggOyAoQmFzaWNTaW1wbGVDaGFyQ2xhc3M6OmlzQWxwaGFOdW1lcmljKCAqcExpbmUsIGJDb21wYXRpYmxlICkgfHwgKCAqcExpbmUgPT0gJ18nICkgKTsgcExpbmUrKyApCgkJCW5Db2wrKzsKCQlhU3ltID0gYUxpbmUuY29weSggbiwgbkNvbCAtIG4gKTsKCgkJLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgImdvIHRvIgoJCWlmKCBiQ29tcGF0aWJsZSAmJiAqcExpbmUgJiYgYVN5bS5FcXVhbHNJZ25vcmVDYXNlQXNjaWkoICJnbyIgKSApCgkJewoJCQljb25zdCBzYWxfVW5pY29kZSogcFRlc3RMaW5lID0gcExpbmU7CgkJCXNob3J0IG5UZXN0Q29sID0gbkNvbDsKCQkJd2hpbGUoIGxjbElzV2hpdGVzcGFjZSggKnBUZXN0TGluZSApICkKCQkJewoJCQkJcFRlc3RMaW5lKys7CgkJCQluVGVzdENvbCsrOwoJCQl9CgoJCQlpZiggKnBUZXN0TGluZSAmJiAqKHBUZXN0TGluZSArIDEpICkKCQkJewoJCQkJU3RyaW5nIGFUZXN0U3ltID0gYUxpbmUuY29weSggblRlc3RDb2wsIDIgKTsKCQkJCWlmKCBhVGVzdFN5bS5FcXVhbHNJZ25vcmVDYXNlQXNjaWkoICJ0byIgKSApCgkJCQl7CgkJCQkJYVN5bSA9IFN0cmluZzo6Q3JlYXRlRnJvbUFzY2lpKCAiZ290byIgKTsKCQkJCQlwTGluZSA9IHBUZXN0TGluZSArIDI7CgkJCQkJbkNvbCA9IG5UZXN0Q29sICsgMjsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gQWJzY2hsaWVzc2VuZGVzICdfJyBkdXJjaCBTcGFjZSBlcnNldHplbiwgd2VubiBaZWlsZW5lbmRlIGZvbGd0CgkJLy8gKHNvbnN0IGZhbHNjaGUgWmVpbGVuZm9ydHNldHp1bmcpCgkJaWYoCSFiVXNlZEZvckhpbGl0ZSAmJiAhKnBMaW5lICYmICoocExpbmUtMSkgPT0gJ18nICkKCQl7CgkJCWFTeW0uR2V0QnVmZmVyQWNjZXNzKCk7CQkvLyAjMTA5NjkzIGZvcmNlIGNvcHkgaWYgbmVjZXNzYXJ5CgkJCSooKHNhbF9Vbmljb2RlKikocExpbmUtMSkpID0gJyAnOwkJLy8gY2FzdCB3ZWdlbiBjb25zdAoJCX0KCQkvLyBUeXBrZW5udW5nPwoJCS8vIERhcyBBdXNydWZlemVpY2hlbiBiaXR0ZSBuaWNodCB0ZXN0ZW4sIHdlbm4KCQkvLyBkYW5hY2ggbm9jaCBlaW4gU3ltYm9sIGFuc2NobGllc3N0CgkJZWxzZSBpZiggKnBMaW5lICE9ICchJyB8fCAhQmFzaWNTaW1wbGVDaGFyQ2xhc3M6OmlzQWxwaGEoIHBMaW5lWyAxIF0sIGJDb21wYXRpYmxlICkgKQoJCXsKCQkJU2J4RGF0YVR5cGUgdCA9IEdldFN1ZmZpeFR5cGUoICpwTGluZSApOwoJCQlpZiggdCAhPSBTYnhWQVJJQU5UICkKCQkJewoJCQkJZVNjYW5UeXBlID0gdDsKCQkJCXBMaW5lKys7CgkJCQluQ29sKys7CgkJCX0KCQl9Cgl9CgoJLy8gWmFobD8gRGFubiBlaW5sZXNlbiB1bmQga29udmVydGllcmVuLgoJZWxzZSBpZiggQmFzaWNTaW1wbGVDaGFyQ2xhc3M6OmlzRGlnaXQoICpwTGluZSAmIDB4RkYgKQoJCXx8ICggKnBMaW5lID09ICcuJyAmJiBCYXNpY1NpbXBsZUNoYXJDbGFzczo6aXNEaWdpdCggKihwTGluZSsxKSAmIDB4RkYgKSApICkKCXsKCQlzaG9ydCBleHAgPSAwOwoJCXNob3J0IGNvbW1hID0gMDsKCQlzaG9ydCBuZGlnID0gMDsKCQlzaG9ydCBuY2RpZyA9IDA7CgkJZVNjYW5UeXBlID0gU2J4RE9VQkxFOwoJCXNhbF9Cb29sIGJCdWZPdmVyZmxvdyA9IHNhbF9GYWxzZTsKCQl3aGlsZSggc3RyY2hyKCAiMDEyMzQ1Njc4OS5ERWRlIiwgKnBMaW5lICkgJiYgKnBMaW5lICkKCQl7CgkJCS8vIEFCIDQuMS4xOTk2OiBCdWZmZXIgdm9sbD8gLT4gbGVlciB3ZWl0ZXIgc2Nhbm5lbgoJCQlpZiggKHAtYnVmKSA9PSAoQlVGX1NJWkUtMSkgKQoJCQl7CgkJCQliQnVmT3ZlcmZsb3cgPSBzYWxfVHJ1ZTsKCQkJCXBMaW5lKyssIG5Db2wrKzsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCS8vIEtvbW1hIG9kZXIgRXhwb25lbnQ/CgkJCWlmKCAqcExpbmUgPT0gJy4nICkKCQkJewoJCQkJaWYoICsrY29tbWEgPiAxICkKCQkJCXsKCQkJCQlwTGluZSsrOyBuQ29sKys7IGNvbnRpbnVlOwoJCQkJfQoJCQkJZWxzZSAqcCsrID0gKnBMaW5lKyssIG5Db2wrKzsKCQkJfQoJCQllbHNlIGlmKCBzdHJjaHIoICJEZEVlIiwgKnBMaW5lICkgKQoJCQl7CgkJCQlpZiAoKytleHAgPiAxKQoJCQkJewoJCQkJCXBMaW5lKys7IG5Db2wrKzsgY29udGludWU7CgkJCQl9Ci8vICAgICAgICAgICAgICBpZiggdG91cHBlciggKnBMaW5lICkgPT0gJ0QnICkKLy8gICAgICAgICAgICAgICAgICBlU2NhblR5cGUgPSBTYnhET1VCTEU7CgkJCQkqcCsrID0gJ0UnOyBwTGluZSsrOyBuQ29sKys7CgkJCQkvLyBWb3J6ZWljaGVuIGhpbnRlciBFeHBvbmVudD8KCQkJCWlmKCAqcExpbmUgPT0gJysnICkKCQkJCQlwTGluZSsrLCBuQ29sKys7CgkJCQllbHNlCgkJCQlpZiggKnBMaW5lID09ICctJyApCgkJCQkJKnArKyA9ICpwTGluZSsrLCBuQ29sKys7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkqcCsrID0gKnBMaW5lKyssIG5Db2wrKzsKCQkJCWlmKCBjb21tYSAmJiAhZXhwICkgbmNkaWcrKzsKCQkJfQoJCQlpZiAoIWV4cCkgbmRpZysrOwoJCX0KCQkqcCA9IDA7CgkJYVN5bSA9IHA7IGJOdW1iZXIgPSBzYWxfVHJ1ZTsKCQkvLyBLb21tYSwgRXhwb25lbnQgbWVocmZhY2ggdm9yaGFuZGVuPwoJCWlmKCBjb21tYSA+IDEgfHwgZXhwID4gMSApCgkJewlhRXJyb3IgPSAnLic7CgkJCUdlbkVycm9yKCBTYkVSUl9CQURfQ0hBUl9JTl9OVU1CRVIgKTsJfQoKCQkvLyAjNTc4NDQgTG9rYWxpc2llcnRlIEZ1bmt0aW9uIGJlbnV0emVuCgkgICAgblZhbCA9IHJ0bF9tYXRoX3VTdHJpbmdUb0RvdWJsZSggYnVmLCBidWYrKHAtYnVmKSwgJy4nLCAnLCcsIE5VTEwsIE5VTEwgKTsKCQkvLyBBTFQ6IG5WYWwgPSBhdG9mKCBidWYgKTsKCgkJbmRpZyA9IG5kaWcgLSBjb21tYTsKCQlpZiggIWNvbW1hICYmICFleHAgKQoJCXsKCQkJaWYoIG5WYWwgPj0gU2J4TUlOSU5UICYmIG5WYWwgPD0gU2J4TUFYSU5UICkKCQkJCWVTY2FuVHlwZSA9IFNieElOVEVHRVI7CgkJCWVsc2UKCQkJaWYoIG5WYWwgPj0gU2J4TUlOTE5HICYmIG5WYWwgPD0gU2J4TUFYTE5HICkKCQkJCWVTY2FuVHlwZSA9IFNieExPTkc7CgkJfQoJCWlmKCBiQnVmT3ZlcmZsb3cgKQoJCQlHZW5FcnJvciggU2JFUlJfTUFUSF9PVkVSRkxPVyApOwoJCS8vIHp1IHZpZWxlIFphaGxlbiBmdWVyIFNJTkdMRT8KLy8gICAgICBpZiAobmRpZyA+IDE1IHx8IG5jZGlnID4gNikKLy8gICAgICAgICAgZVNjYW5UeXBlID0gU2J4RE9VQkxFOwovLyAgICAgIGVsc2UKLy8gICAgICBpZiggblZhbCA+IFNieE1BWFNORyB8fCBuVmFsIDwgU2J4TUlOU05HICkKLy8gICAgICAgICAgZVNjYW5UeXBlID0gU2J4RE9VQkxFOwoKCQkvLyBUeXBrZW5udW5nPwoJCVNieERhdGFUeXBlIHQgPSBHZXRTdWZmaXhUeXBlKCAqcExpbmUgKTsKCQlpZiggdCAhPSBTYnhWQVJJQU5UICkKCQl7CgkJCWVTY2FuVHlwZSA9IHQ7CgkJCXBMaW5lKys7CgkJCW5Db2wrKzsKCQl9Cgl9CgoJLy8gSGV4L09rdGFsemFobD8gRWlubGVzZW4gdW5kIGtvbnZlcnRpZXJlbjoKCWVsc2UgaWYoICpwTGluZSA9PSAnJicgKQoJewoJCXBMaW5lKys7IG5Db2wrKzsKCQlzYWxfVW5pY29kZSBjbXAxW10gPSB7ICcwJywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnQScsJ0InLCdDJywnRCcsJ0UnLCdGJywgMCB9OwoJCXNhbF9Vbmljb2RlIGNtcDJbXSA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsIDAgfTsKCQlzYWxfVW5pY29kZSAqY21wID0gY21wMTsKCQkvL2NoYXIgKmNtcCA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKCQlzYWxfVW5pY29kZSBiYXNlID0gMTY7CgkJc2FsX1VuaWNvZGUgbmRpZyA9IDg7CgkJc2FsX1VuaWNvZGUgeGNoICA9ICpwTGluZSsrICYgMHhGRjsgbkNvbCsrOwoJCXN3aXRjaCggdG91cHBlciggeGNoICkgKQoJCXsKCQkJY2FzZSAnTyc6CgkJCQljbXAgPSBjbXAyOyBiYXNlID0gODsgbmRpZyA9IDExOyBicmVhazsKCQkJCS8vY21wID0gIjAxMjM0NTY3IjsgYmFzZSA9IDg7IG5kaWcgPSAxMTsgYnJlYWs7CgkJCWNhc2UgJ0gnOgoJCQkJYnJlYWs7CgkJCWRlZmF1bHQgOgoJCQkJLy8gV2lyZCBhbHMgT3BlcmF0b3IgYW5nZXNlaGVuCgkJCQlwTGluZS0tOyBuQ29sLS07IG5Db2wxID0gbkNvbC0xOyBhU3ltID0gJyYnOyByZXR1cm4gU1lNQk9MOwoJCX0KCQliTnVtYmVyID0gc2FsX1RydWU7CgkJbG9uZyBsID0gMDsKCQlpbnQgaTsKCQlzYWxfQm9vbCBiQnVmT3ZlcmZsb3cgPSBzYWxfRmFsc2U7CgkJd2hpbGUoIEJhc2ljU2ltcGxlQ2hhckNsYXNzOjppc0FscGhhTnVtZXJpYyggKnBMaW5lICYgMHhGRiwgYkNvbXBhdGlibGUgKSApCgkJewoJCQlzYWxfVW5pY29kZSBjaCA9IHNhbDo6c3RhdGljX2ludF9jYXN0PCBzYWxfVW5pY29kZSA+KAogICAgICAgICAgICAgICAgdG91cHBlciggKnBMaW5lICYgMHhGRiApICk7CgkJCXBMaW5lKys7IG5Db2wrKzsKCQkJLy8gQUIgNC4xLjE5OTY6IEJ1ZmZlciB2b2xsLCBsZWVyIHdlaXRlciBzY2FubmVuCgkJCWlmKCAocC1idWYpID09IChCVUZfU0laRS0xKSApCgkJCQliQnVmT3ZlcmZsb3cgPSBzYWxfVHJ1ZTsKCQkJZWxzZSBpZiggU3RyaW5nKCBjbXAgKS5TZWFyY2goIGNoICkgIT0gU1RSSU5HX05PVEZPVU5EICkKCQkJLy9lbHNlIGlmKCBzdHJjaHIoIGNtcCwgY2ggKSApCgkJCQkqcCsrID0gY2g7CgkJCWVsc2UKCQkJewoJCQkJYUVycm9yID0gY2g7CgkJCQlHZW5FcnJvciggU2JFUlJfQkFEX0NIQVJfSU5fTlVNQkVSICk7CgkJCX0KCQl9CgkJKnAgPSAwOwoJCWZvciggcCA9IGJ1ZjsgKnA7IHArKyApCgkJewoJCQlpID0gKCpwICYgMHhGRikgLSAnMCc7CgkJCWlmKCBpID4gOSApIGkgLT0gNzsKCQkJbCA9ICggbCAqIGJhc2UgKSArIGk7CgkJCWlmKCAhbmRpZy0tICkKCQkJewoJCQkJR2VuRXJyb3IoIFNiRVJSX01BVEhfT1ZFUkZMT1cgKTsgYnJlYWs7CgkJCX0KCQl9CgkJaWYoICpwTGluZSA9PSAnJicgKSBwTGluZSsrLCBuQ29sKys7CgkJblZhbCA9IChkb3VibGUpIGw7CgkJZVNjYW5UeXBlID0gKCBsID49IFNieE1JTklOVCAmJiBsIDw9IFNieE1BWElOVCApID8gU2J4SU5URUdFUiA6IFNieExPTkc7CgkJaWYoIGJCdWZPdmVyZmxvdyApCgkJCUdlbkVycm9yKCBTYkVSUl9NQVRIX09WRVJGTE9XICk7Cgl9CgoJLy8gU3RyaW5nczoKCWVsc2UgaWYoICpwTGluZSA9PSAnIicgfHwgKnBMaW5lID09ICdbJyApCgl7CgkJc2FsX1VuaWNvZGUgY1NlcCA9ICpwTGluZTsKCQlpZiggY1NlcCA9PSAnWycgKQoJCQliU3ltYm9sID0gc2FsX1RydWUsIGNTZXAgPSAnXSc7CgkJc2hvcnQgbiA9IG5Db2wrMTsKCQl3aGlsZSggKnBMaW5lICkKCQl7CgkJCWRvIHBMaW5lKyssIG5Db2wrKzsKCQkJd2hpbGUoICpwTGluZSAmJiAoICpwTGluZSAhPSBjU2VwICkgKTsKCQkJaWYoICpwTGluZSA9PSBjU2VwICkKCQkJewoJCQkJcExpbmUrKzsgbkNvbCsrOwoJCQkJaWYoICpwTGluZSAhPSBjU2VwIHx8IGNTZXAgPT0gJ10nICkgYnJlYWs7CgkJCX0gZWxzZSBhRXJyb3IgPSBjU2VwLCBHZW5FcnJvciggU2JFUlJfRVhQRUNURUQgKTsKCQl9CgkJLy8gSWYgVkJBIEludGVyb3AgdGhlbiBkb2VuJ3QgZWF0IHRoZSBbXSBjaGFycwkKCQlpZiAoIGNTZXAgPT0gJ10nICYmIGJWQkFTdXBwb3J0T24gKQoJCQlhU3ltID0gYUxpbmUuY29weSggbiAtIDEsIG5Db2wgLSBuICArIDEpOwoJCWVsc2UKCQkJYVN5bSA9IGFMaW5lLmNvcHkoIG4sIG5Db2wgLSBuIC0gMSApOwoJCS8vIERvcHBlbHRlIFN0cmluZ2JlZ3JlbnplciByYXVzCgkJU3RyaW5nIHMoIGNTZXAgKTsKCQlzICs9IGNTZXA7CgkJc2FsX3VJbnQxNiBuSWR4ID0gMDsKCQlkbyAKCQl7CgkJCW5JZHggPSBhU3ltLlNlYXJjaCggcywgbklkeCApOwoJCQlpZiggbklkeCA9PSBTVFJJTkdfTk9URk9VTkQgKQoJCQkJYnJlYWs7CgkJCWFTeW0uRXJhc2UoIG5JZHgsIDEgKTsKCQkJbklkeCsrOwoJCX0gCgkJd2hpbGUoIHRydWUgKTsKCQlpZiggY1NlcCAhPSAnXScgKQoJCQllU2NhblR5cGUgPSAoIGNTZXAgPT0gJyMnICkgPyBTYnhEQVRFIDogU2J4U1RSSU5HOwoJfQoJLy8gdW5ndWVsdGlnZSBaZWljaGVuOgoJZWxzZSBpZiggKCAqcExpbmUgJiAweEZGICkgPj0gMHg3RiApCgl7CgkJR2VuRXJyb3IoIFNiRVJSX1NZTlRBWCApOyBwTGluZSsrOyBuQ29sKys7Cgl9CgkvLyBhbmRlcmUgR3J1cHBlbjoKCWVsc2UKCXsKCQlzaG9ydCBuID0gMTsKCQlzd2l0Y2goICpwTGluZSsrICkKCQl7CgkJCWNhc2UgJzwnOiBpZiggKnBMaW5lID09ICc+JyB8fCAqcExpbmUgPT0gJz0nICkgbiA9IDI7IGJyZWFrOwoJCQljYXNlICc+JzogaWYoICpwTGluZSA9PSAnPScgKSBuID0gMjsgYnJlYWs7CgkJCWNhc2UgJzonOiBpZiggKnBMaW5lID09ICc9JyApIG4gPSAyOyBicmVhazsKCQl9CgkJYVN5bSA9IGFMaW5lLmNvcHkoIG5Db2wsIG4gKTsKCQlwTGluZSArPSBuLTE7IG5Db2wgPSBuQ29sICsgbjsKCX0KCgluQ29sMiA9IG5Db2wtMTsKClByZXZMaW5lQ29tbWVudExibDoKCS8vIEtvbW1lbnRhcj8KCWlmKCBiUHJldkxpbmVFeHRlbnRzQ29tbWVudCB8fCAoZVNjYW5UeXBlICE9IFNieFNUUklORyAmJgoJCSggYVN5bS5HZXRCdWZmZXIoKVswXSA9PSAnXCcnIHx8IGFTeW0uRXF1YWxzSWdub3JlQ2FzZUFzY2lpKCAiUkVNIiApICkgKSApCgl7CgkJYlByZXZMaW5lRXh0ZW50c0NvbW1lbnQgPSBzYWxfRmFsc2U7CgkJYVN5bSA9IFN0cmluZzo6Q3JlYXRlRnJvbUFzY2lpKCAiUkVNIiApOwoJCXNhbF91SW50MTYgbkxlbiA9IFN0cmluZyggcExpbmUgKS5MZW4oKTsKCQlpZiggYkNvbXBhdGlibGUgJiYgcExpbmVbIG5MZW4gLSAxIF0gPT0gJ18nICYmIHBMaW5lWyBuTGVuIC0gMiBdID09ICcgJyApCgkJCWJQcmV2TGluZUV4dGVudHNDb21tZW50ID0gc2FsX1RydWU7CgkJbkNvbDIgPSBuQ29sMiArIG5MZW47CgkJcExpbmUgPSBOVUxMOwoJfQoJcmV0dXJuIHNhbF9UcnVlOwoKCS8vIFNvbnN0IFplaWxlbi1FbmRlOiBhYmVyIGJpdHRlIGF1ZiAnXycgdGVzdGVuLCBvYiBkaWUKCS8vIFplaWxlIG5pY2h0IHdlaXRlcmdlaHQhCmVvbG46CglpZiggbkNvbCAmJiAqLS1wTGluZSA9PSAnXycgKQoJewoJCXBMaW5lID0gTlVMTDsgCgkJYm9vbCBiUmVzID0gTmV4dFN5bSgpOwoJCWlmKCBiVkJBU3VwcG9ydE9uICYmIGFTeW0uR2V0QnVmZmVyKClbMF0gPT0gJy4nICkKCQl7CgkJCS8vIG9iamVjdCBfCgkJCS8vICAgIC5NZXRob2QKCQkJLy8gXl5eICA8LSBzcGFjZXMgaXMgbGVnYWwgaW4gTVNPIFZCQQoJCQlPU0xfVFJBQ0UoIioqKiByZXNldHRpbmcgYlNwYWNlcyoqKiIpOyAKCQkJYlNwYWNlcyA9IHNhbF9GYWxzZTsgCgkJfQoJCXJldHVybiBiUmVzOwoJfQoJZWxzZQoJewoJCXBMaW5lID0gTlVMTDsKCQluTGluZSA9IG5PbGRMaW5lOwoJCW5Db2wxID0gbk9sZENvbDE7CgkJbkNvbDIgPSBuT2xkQ29sMjsKCQlhU3ltID0gJ1xuJzsKCQluQ29sTG9jayA9IDA7CgkJcmV0dXJuIHNhbF9UcnVlOwoJfQp9CgpMZXR0ZXJUYWJsZSBCYXNpY1NpbXBsZUNoYXJDbGFzczo6YUxldHRlclRhYmxlOwoKTGV0dGVyVGFibGU6OkxldHRlclRhYmxlKCB2b2lkICkKewoJZm9yKCBpbnQgaSA9IDAgOyBpIDwgMjU2IDsgKytpICkKCQlJc0xldHRlclRhYltpXSA9IGZhbHNlOwoKCUlzTGV0dGVyVGFiWzB4QzBdID0gdHJ1ZTsJLy8gwCAsIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRSBBQ0NFTlQKCUlzTGV0dGVyVGFiWzB4QzFdID0gdHJ1ZTsJLy8gwSAsIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURSBBQ0NFTlQKCUlzTGV0dGVyVGFiWzB4QzJdID0gdHJ1ZTsJLy8gwiAsIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhDM10gPSB0cnVlOwkvLyDDICwgQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCglJc0xldHRlclRhYlsweEM0XSA9IHRydWU7CS8vIMQgLCBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCglJc0xldHRlclRhYlsweEM1XSA9IHRydWU7CS8vIMUgLCBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQoJSXNMZXR0ZXJUYWJbMHhDNl0gPSB0cnVlOwkvLyDGICwgQ0FQSVRBTCBMSUdBVFVSRSBBRQoJSXNMZXR0ZXJUYWJbMHhDN10gPSB0cnVlOwkvLyDHICwgQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKCUlzTGV0dGVyVGFiWzB4QzhdID0gdHJ1ZTsJLy8gyCAsIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRSBBQ0NFTlQKCUlzTGV0dGVyVGFiWzB4QzldID0gdHJ1ZTsJLy8gySAsIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURSBBQ0NFTlQKCUlzTGV0dGVyVGFiWzB4Q0FdID0gdHJ1ZTsJLy8gyiAsIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhDQl0gPSB0cnVlOwkvLyDLICwgQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUwoJSXNMZXR0ZXJUYWJbMHhDQ10gPSB0cnVlOwkvLyDMICwgQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhDRF0gPSB0cnVlOwkvLyDNICwgQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhDRV0gPSB0cnVlOwkvLyDOICwgQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVggQUNDRU5UCglJc0xldHRlclRhYlsweENGXSA9IHRydWU7CS8vIM8gLCBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCglJc0xldHRlclRhYlsweEQwXSA9IHRydWU7CS8vINAgLCBDQVBJVEFMIExFVFRFUiBFVEgKCUlzTGV0dGVyVGFiWzB4RDFdID0gdHJ1ZTsJLy8g0SAsIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQoJSXNMZXR0ZXJUYWJbMHhEMl0gPSB0cnVlOwkvLyDSICwgQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhEM10gPSB0cnVlOwkvLyDTICwgQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhENF0gPSB0cnVlOwkvLyDUICwgQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQUNDRU5UCglJc0xldHRlclRhYlsweEQ1XSA9IHRydWU7CS8vINUgLCBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKCUlzTGV0dGVyVGFiWzB4RDZdID0gdHJ1ZTsJLy8g1iAsIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKCUlzTGV0dGVyVGFiWzB4RDhdID0gdHJ1ZTsJLy8g2CAsIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKCUlzTGV0dGVyVGFiWzB4RDldID0gdHJ1ZTsJLy8g2SAsIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRSBBQ0NFTlQKCUlzTGV0dGVyVGFiWzB4REFdID0gdHJ1ZTsJLy8g2iAsIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURSBBQ0NFTlQKCUlzTGV0dGVyVGFiWzB4REJdID0gdHJ1ZTsJLy8g2yAsIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhEQ10gPSB0cnVlOwkvLyDcICwgQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUwoJSXNMZXR0ZXJUYWJbMHhERF0gPSB0cnVlOwkvLyDdICwgQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhERV0gPSB0cnVlOwkvLyDeICwgQ0FQSVRBTCBMRVRURVIgVEhPUk4KCUlzTGV0dGVyVGFiWzB4REZdID0gdHJ1ZTsJLy8g3yAsIFNNQUxMIExFVFRFUiBTSEFSUCBTCglJc0xldHRlclRhYlsweEUwXSA9IHRydWU7CS8vIOAgLCBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhFMV0gPSB0cnVlOwkvLyDhICwgU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURSBBQ0NFTlQKCUlzTGV0dGVyVGFiWzB4RTJdID0gdHJ1ZTsJLy8g4iAsIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBQ0NFTlQKCUlzTGV0dGVyVGFiWzB4RTNdID0gdHJ1ZTsJLy8g4yAsIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKCUlzTGV0dGVyVGFiWzB4RTRdID0gdHJ1ZTsJLy8g5CAsIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCglJc0xldHRlclRhYlsweEU1XSA9IHRydWU7CS8vIOUgLCBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKCUlzTGV0dGVyVGFiWzB4RTZdID0gdHJ1ZTsJLy8g5iAsIFNNQUxMIExJR0FUVVJFIEFFCglJc0xldHRlclRhYlsweEU3XSA9IHRydWU7CS8vIOcgLCBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKCUlzTGV0dGVyVGFiWzB4RThdID0gdHJ1ZTsJLy8g6CAsIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUgQUNDRU5UCglJc0xldHRlclRhYlsweEU5XSA9IHRydWU7CS8vIOkgLCBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhFQV0gPSB0cnVlOwkvLyDqICwgU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhFQl0gPSB0cnVlOwkvLyDrICwgU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKCUlzTGV0dGVyVGFiWzB4RUNdID0gdHJ1ZTsJLy8g7CAsIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUgQUNDRU5UCglJc0xldHRlclRhYlsweEVEXSA9IHRydWU7CS8vIO0gLCBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhFRV0gPSB0cnVlOwkvLyDuICwgU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhFRl0gPSB0cnVlOwkvLyDvICwgU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKCUlzTGV0dGVyVGFiWzB4RjBdID0gdHJ1ZTsJLy8g8CAsIFNNQUxMIExFVFRFUiBFVEgKCUlzTGV0dGVyVGFiWzB4RjFdID0gdHJ1ZTsJLy8g8SAsIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKCUlzTGV0dGVyVGFiWzB4RjJdID0gdHJ1ZTsJLy8g8iAsIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUgQUNDRU5UCglJc0xldHRlclRhYlsweEYzXSA9IHRydWU7CS8vIPMgLCBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhGNF0gPSB0cnVlOwkvLyD0ICwgU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhGNV0gPSB0cnVlOwkvLyD1ICwgU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQoJSXNMZXR0ZXJUYWJbMHhGNl0gPSB0cnVlOwkvLyD2ICwgU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKCUlzTGV0dGVyVGFiWzB4RjhdID0gdHJ1ZTsJLy8g+CAsIFNNQUxMIExFVFRFUiBPIFdJVEggT0JMSVFVRSBCQVIKCUlzTGV0dGVyVGFiWzB4RjldID0gdHJ1ZTsJLy8g+SAsIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUgQUNDRU5UCglJc0xldHRlclRhYlsweEZBXSA9IHRydWU7CS8vIPogLCBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhGQl0gPSB0cnVlOwkvLyD7ICwgU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYIEFDQ0VOVAoJSXNMZXR0ZXJUYWJbMHhGQ10gPSB0cnVlOwkvLyD8ICwgU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKCUlzTGV0dGVyVGFiWzB4RkRdID0gdHJ1ZTsJLy8g/SAsIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUgQUNDRU5UCglJc0xldHRlclRhYlsweEZFXSA9IHRydWU7CS8vIP4gLCBTTUFMTCBMRVRURVIgVEhPUk4KCUlzTGV0dGVyVGFiWzB4RkZdID0gdHJ1ZTsJLy8g/yAsIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCn0KCmJvb2wgTGV0dGVyVGFibGU6OmlzTGV0dGVyVW5pY29kZSggc2FsX1VuaWNvZGUgYyApCnsKCXN0YXRpYyBDaGFyQ2xhc3MqIHBDaGFyQ2xhc3MgPSBOVUxMOwoJaWYoIHBDaGFyQ2xhc3MgPT0gTlVMTCApCgkJcENoYXJDbGFzcyA9IG5ldyBDaGFyQ2xhc3MoIEFwcGxpY2F0aW9uOjpHZXRTZXR0aW5ncygpLkdldExvY2FsZSgpICk7CglTdHJpbmcgYVN0ciggYyApOwoJYm9vbCBiUmV0ID0gcENoYXJDbGFzcy0+aXNMZXR0ZXIoIGFTdHIsIDAgKTsKCXJldHVybiBiUmV0Owp9Cg==