LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENPUFlSSUdIVDogCiAqIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZAogKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgX1RTVE5PUk0KI2luY2x1ZGUgInRzdG5vcm0uaCIKI2VuZGlmCgoKI2RlZmluZSBBUlJBWV9MRU5HVEgoYXJyYXkpIChzaXplb2YgKGFycmF5KSAvIHNpemVvZiAoKmFycmF5KSkKCnN0YXRpYyBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKCi8qKgogKiBDb252ZXJ0IEphdmEtc3R5bGUgc3RyaW5ncyB3aXRoIFx1IFVuaWNvZGUgZXNjYXBlcyBpbnRvIFVuaWNvZGVTdHJpbmcgb2JqZWN0cwogKi8Kc3RhdGljIFVuaWNvZGVTdHJpbmcgc3RyKGNvbnN0IGNoYXIgKmlucHV0KQp7CiAgc3RhdGljIGNvbnN0IFVuaWNvZGVTdHJpbmcgZGlnaXRTdHJpbmcxKCIwMTIzNDU2Nzg5QUJDREVGIik7CiAgc3RhdGljIGNvbnN0IFVuaWNvZGVTdHJpbmcgZGlnaXRTdHJpbmcyKCIwMTIzNDU2Nzg5YWJjZGVmIik7CiAgCiAgVW5pY29kZVN0cmluZyByZXN1bHQoaW5wdXQpOwogIGludCBpbmRleCA9IDA7CiAgCiAgd2hpbGUgKChpbmRleCA9IHJlc3VsdC5pbmRleE9mKCJcXHUiKSkgIT0gLTEpCiAgICB7CiAgICAgIGlmIChpbmRleCArIDYgPD0gcmVzdWx0Lmxlbmd0aCgpKQogICAgewogICAgICBVQ2hhciBjID0gMDsKICAgICAgZm9yIChpbnQgaSA9IGluZGV4ICsgMjsgaSA8IGluZGV4ICsgNjsgaSsrKSB7CiAgICAgICAgVVRleHRPZmZzZXQgdmFsdWUgPSBkaWdpdFN0cmluZzEuaW5kZXhPZihyZXN1bHRbaV0pOwogICAgICAgIAogICAgICAgIGlmICh2YWx1ZSA9PSAtMSkgewogICAgICAgICAgdmFsdWUgPSBkaWdpdFN0cmluZzIuaW5kZXhPZihyZXN1bHRbaV0pOwogICAgICAgIH0KICAgICAgICBjID0gKFVDaGFyKShjICogMTYgKyB2YWx1ZSk7CiAgICAgIH0KICAgICAgVW5pY29kZVN0cmluZyByZXBsYWNlOwogICAgICByZXBsYWNlICs9IGM7CiAgICAgIHJlc3VsdC5yZXBsYWNlKGluZGV4LCA2LCByZXBsYWNlKTsKICAgIH0KICAgICAgaW5kZXggKz0gMTsKICAgIH0KCiAgcmV0dXJuIHJlc3VsdDsKfQoKClVuaWNvZGVTdHJpbmcgQmFzaWNOb3JtYWxpemVyVGVzdDo6Y2Fub25UZXN0c1syM11bM107CgpVbmljb2RlU3RyaW5nIEJhc2ljTm9ybWFsaXplclRlc3Q6OmNvbXBhdFRlc3RzWzExXVszXTsKCkJhc2ljTm9ybWFsaXplclRlc3Q6OkJhc2ljTm9ybWFsaXplclRlc3QoKQp7CiAgLy8gY2Fub25UZXN0CiAgLy8gSW5wdXQgICAgICAgICAgICAgICAgICAgIERlY29tcG9zZWQgICAgICAgICAgICAgICAgICAgIENvbXBvc2VkCgogICAgY2Fub25UZXN0c1swXVswXSA9IHN0cigiY2F0Iik7ICBjYW5vblRlc3RzWzBdWzFdID0gc3RyKCJjYXQiKTsgY2Fub25UZXN0c1swXVsyXSA9ICBzdHIoImNhdCIpOwoKICAgIGNhbm9uVGVzdHNbMV1bMF0gPSBzdHIoIlxcdTAwZTBhcmR2YXJrIik7ICAgIGNhbm9uVGVzdHNbMV1bMV0gPSBzdHIoImFcXHUwMzAwYXJkdmFyayIpOyAgY2Fub25UZXN0c1sxXVsyXSA9IHN0cigiXFx1MDBlMGFyZHZhcmsiKTsgCgogICAgY2Fub25UZXN0c1syXVswXSA9IHN0cigiXFx1MWUwYSIpOyBjYW5vblRlc3RzWzJdWzFdID0gc3RyKCJEXFx1MDMwNyIpOyBjYW5vblRlc3RzWzJdWzJdID0gc3RyKCJcXHUxZTBhIik7ICAgICAgICAgICAgICAgICAvLyBELWRvdF9hYm92ZQoKICAgIGNhbm9uVGVzdHNbM11bMF0gPSBzdHIoIkRcXHUwMzA3Iik7ICBjYW5vblRlc3RzWzNdWzFdID0gc3RyKCJEXFx1MDMwNyIpOyBjYW5vblRlc3RzWzNdWzJdID0gc3RyKCJcXHUxZTBhIik7ICAgICAgICAgICAgLy8gRCBkb3RfYWJvdmUKCiAgICBjYW5vblRlc3RzWzRdWzBdID0gc3RyKCJcXHUxZTBjXFx1MDMwNyIpOyBjYW5vblRlc3RzWzRdWzFdID0gc3RyKCJEXFx1MDMyM1xcdTAzMDciKTsgIGNhbm9uVGVzdHNbNF1bMl0gPSBzdHIoIlxcdTFlMGNcXHUwMzA3Iik7ICAgICAgICAgLy8gRC1kb3RfYmVsb3cgZG90X2Fib3ZlCgogICAgY2Fub25UZXN0c1s1XVswXSA9IHN0cigiXFx1MWUwYVxcdTAzMjMiKTsgY2Fub25UZXN0c1s1XVsxXSA9IHN0cigiRFxcdTAzMjNcXHUwMzA3Iik7ICBjYW5vblRlc3RzWzVdWzJdID0gc3RyKCJcXHUxZTBjXFx1MDMwNyIpOyAgICAgICAgLy8gRC1kb3RfYWJvdmUgZG90X2JlbG93IAoKICAgIGNhbm9uVGVzdHNbNl1bMF0gPSBzdHIoIkRcXHUwMzA3XFx1MDMyMyIpOyBjYW5vblRlc3RzWzZdWzFdID0gc3RyKCJEXFx1MDMyM1xcdTAzMDciKTsgIGNhbm9uVGVzdHNbNl1bMl0gPSBzdHIoIlxcdTFlMGNcXHUwMzA3Iik7ICAgICAgICAgLy8gRCBkb3RfYmVsb3cgZG90X2Fib3ZlIAoKICAgIGNhbm9uVGVzdHNbN11bMF0gPSBzdHIoIlxcdTFlMTBcXHUwMzA3XFx1MDMyMyIpOyAgY2Fub25UZXN0c1s3XVsxXSA9IHN0cigiRFxcdTAzMjdcXHUwMzIzXFx1MDMwNyIpOyBjYW5vblRlc3RzWzddWzJdID0gc3RyKCJcXHUxZTEwXFx1MDMyM1xcdTAzMDciKTsgICAgIC8vIEQgZG90X2JlbG93IGNlZGlsbGEgZG90X2Fib3ZlCgogICAgY2Fub25UZXN0c1s4XVswXSA9IHN0cigiRFxcdTAzMDdcXHUwMzI4XFx1MDMyMyIpOyBjYW5vblRlc3RzWzhdWzFdID0gc3RyKCJEXFx1MDMyOFxcdTAzMjNcXHUwMzA3Iik7IGNhbm9uVGVzdHNbOF1bMl0gPSBzdHIoIlxcdTFlMGNcXHUwMzI4XFx1MDMwNyIpOyAgICAgLy8gRCBkb3RfYWJvdmUgb2dvbmVrIGRvdF9iZWxvdwoKICAgIGNhbm9uVGVzdHNbOV1bMF0gPSBzdHIoIlxcdTFFMTQiKTsgY2Fub25UZXN0c1s5XVsxXSA9IHN0cigiRVxcdTAzMDRcXHUwMzAwIik7IGNhbm9uVGVzdHNbOV1bMl0gPSBzdHIoIlxcdTFFMTQiKTsgICAgICAgICAvLyBFLW1hY3Jvbi1ncmF2ZQoKICAgIGNhbm9uVGVzdHNbMTBdWzBdID0gc3RyKCJcXHUwMTEyXFx1MDMwMCIpOyBjYW5vblRlc3RzWzEwXVsxXSA9IHN0cigiRVxcdTAzMDRcXHUwMzAwIik7ICBjYW5vblRlc3RzWzEwXVsyXSA9IHN0cigiXFx1MUUxNCIpOyAgICAgICAgICAgIC8vIEUtbWFjcm9uICsgZ3JhdmUKCiAgICBjYW5vblRlc3RzWzExXVswXSA9IHN0cigiXFx1MDBjOFxcdTAzMDQiKTsgY2Fub25UZXN0c1sxMV1bMV0gPSBzdHIoIkVcXHUwMzAwXFx1MDMwNCIpOyAgY2Fub25UZXN0c1sxMV1bMl0gPSBzdHIoIlxcdTAwYzhcXHUwMzA0Iik7ICAgICAgICAgLy8gRS1ncmF2ZSArIG1hY3JvbgogIAogICAgY2Fub25UZXN0c1sxMl1bMF0gPSBzdHIoIlxcdTIxMmIiKTsgY2Fub25UZXN0c1sxMl1bMV0gPSBzdHIoIkFcXHUwMzBhIik7IGNhbm9uVGVzdHNbMTJdWzJdID0gc3RyKCJcXHUwMGM1Iik7ICAgICAgICAgICAgIC8vIGFuZ3N0cm9tX3NpZ24KCiAgICBjYW5vblRlc3RzWzEzXVswXSA9IHN0cigiXFx1MDBjNSIpOyAgICAgIGNhbm9uVGVzdHNbMTNdWzFdID0gc3RyKCJBXFx1MDMwYSIpOyAgY2Fub25UZXN0c1sxM11bMl0gPSBzdHIoIlxcdTAwYzUiKTsgICAgICAgICAgICAvLyBBLXJpbmcKICAKICAgIGNhbm9uVGVzdHNbMTRdWzBdID0gc3RyKCLEZmZpbiIpOyAgY2Fub25UZXN0c1sxNF1bMV0gPSBzdHIoIkFcXHUwMzA4ZmZpbiIpOyAgY2Fub25UZXN0c1sxNF1bMl0gPSBzdHIoIsRmZmluIik7CgogICAgY2Fub25UZXN0c1sxNV1bMF0gPSBzdHIoIsRcXHVGQjAzbiIpOyBjYW5vblRlc3RzWzE1XVsxXSA9IHN0cigiQVxcdTAzMDhcXHVGQjAzbiIpOyBjYW5vblRlc3RzWzE1XVsyXSA9IHN0cigixFxcdUZCMDNuIik7CiAgCiAgICBjYW5vblRlc3RzWzE2XVswXSA9IHN0cigiSGVucnkgSVYiKTsgY2Fub25UZXN0c1sxNl1bMV0gPSBzdHIoIkhlbnJ5IElWIik7IGNhbm9uVGVzdHNbMTZdWzJdID0gc3RyKCJIZW5yeSBJViIpOwoKICAgIGNhbm9uVGVzdHNbMTddWzBdID0gc3RyKCJIZW5yeSBcXHUyMTYzIik7ICBjYW5vblRlc3RzWzE3XVsxXSA9IHN0cigiSGVucnkgXFx1MjE2MyIpOyAgY2Fub25UZXN0c1sxN11bMl0gPSBzdHIoIkhlbnJ5IFxcdTIxNjMiKTsKICAKICAgIGNhbm9uVGVzdHNbMThdWzBdID0gc3RyKCJcXHUzMEFDIik7ICBjYW5vblRlc3RzWzE4XVsxXSA9IHN0cigiXFx1MzBBQlxcdTMwOTkiKTsgIGNhbm9uVGVzdHNbMThdWzJdID0gc3RyKCJcXHUzMEFDIik7ICAgICAgICAgICAgICAvLyBnYSAoS2F0YWthbmEpCgogICAgY2Fub25UZXN0c1sxOV1bMF0gPSBzdHIoIlxcdTMwQUJcXHUzMDk5Iik7IGNhbm9uVGVzdHNbMTldWzFdID0gc3RyKCJcXHUzMEFCXFx1MzA5OSIpOyAgY2Fub25UZXN0c1sxOV1bMl0gPSBzdHIoIlxcdTMwQUMiKTsgICAgICAgICAgICAvLyBrYSArIHRlbgoKICAgIGNhbm9uVGVzdHNbMjBdWzBdID0gc3RyKCJcXHVGRjc2XFx1RkY5RSIpOyBjYW5vblRlc3RzWzIwXVsxXSA9IHN0cigiXFx1RkY3NlxcdUZGOUUiKTsgIGNhbm9uVGVzdHNbMjBdWzJdID0gc3RyKCJcXHVGRjc2XFx1RkY5RSIpOyAgICAgICAvLyBod19rYSArIGh3X3RlbgoKICAgIGNhbm9uVGVzdHNbMjFdWzBdID0gc3RyKCJcXHUzMEFCXFx1RkY5RSIpOyBjYW5vblRlc3RzWzIxXVsxXSA9IHN0cigiXFx1MzBBQlxcdUZGOUUiKTsgIGNhbm9uVGVzdHNbMjFdWzJdID0gc3RyKCJcXHUzMEFCXFx1RkY5RSIpOyAgICAgICAgIC8vIGthICsgaHdfdGVuCgogICAgY2Fub25UZXN0c1syMl1bMF0gPSBzdHIoIlxcdUZGNzZcXHUzMDk5Iik7IGNhbm9uVGVzdHNbMjJdWzFdID0gc3RyKCJcXHVGRjc2XFx1MzA5OSIpOyAgY2Fub25UZXN0c1syMl1bMl0gPSBzdHIoIlxcdUZGNzZcXHUzMDk5Iik7ICAgICAgICAgLy8gaHdfa2EgKyB0ZW4KCiAgICAvKiBjb21wYXRUZXN0ICovCiAgLy8gSW5wdXQgICAgICAgICAgICAgICAgICAgICAgICBEZWNvbXBvc2VkICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zZWQKICBjb21wYXRUZXN0c1swXVswXSA9IHN0cigiY2F0Iik7IGNvbXBhdFRlc3RzWzBdWzFdID0gc3RyKCJjYXQiKTsgY29tcGF0VGVzdHNbMF1bMl0gPSBzdHIoImNhdCIpIDsKICAKICBjb21wYXRUZXN0c1sxXVswXSA9IHN0cigiXFx1RkI0ZiIpOyAgY29tcGF0VGVzdHNbMV1bMV0gPSBzdHIoIlxcdTA1RDBcXHUwNURDIik7IGNvbXBhdFRlc3RzWzFdWzJdID0gc3RyKCJcXHUwNUQwXFx1MDVEQyIpOyAgLy8gQWxlZi1MYW1lZCB2cy4gQWxlZiwgTGFtZWQKICAKICBjb21wYXRUZXN0c1syXVswXSA9IHN0cigixGZmaW4iKTsgY29tcGF0VGVzdHNbMl1bMV0gPSBzdHIoIkFcXHUwMzA4ZmZpbiIpOyBjb21wYXRUZXN0c1syXVsyXSA9IHN0cigixGZmaW4iKSA7CgogIGNvbXBhdFRlc3RzWzNdWzBdID0gc3RyKCLEXFx1RkIwM24iKTsgY29tcGF0VGVzdHNbM11bMV0gPSBzdHIoIkFcXHUwMzA4ZmZpbiIpOyBjb21wYXRUZXN0c1szXVsyXSA9IHN0cigixGZmaW4iKSA7IC8vIGZmaSBsaWdhdHVyZSAtPiBmICsgZiArIGkKICAKICBjb21wYXRUZXN0c1s0XVswXSA9IHN0cigiSGVucnkgSVYiKTsgY29tcGF0VGVzdHNbNF1bMV0gPSBzdHIoIkhlbnJ5IElWIik7IGNvbXBhdFRlc3RzWzRdWzJdID0gc3RyKCJIZW5yeSBJViIpIDsKCiAgY29tcGF0VGVzdHNbNV1bMF0gPSBzdHIoIkhlbnJ5IFxcdTIxNjMiKTsgY29tcGF0VGVzdHNbNV1bMV0gPSBzdHIoIkhlbnJ5IElWIik7ICBjb21wYXRUZXN0c1s1XVsyXSA9IHN0cigiSGVucnkgSVYiKSA7CiAgCiAgY29tcGF0VGVzdHNbNl1bMF0gPSBzdHIoIlxcdTMwQUMiKTsgY29tcGF0VGVzdHNbNl1bMV0gPSBzdHIoIlxcdTMwQUJcXHUzMDk5Iik7IGNvbXBhdFRlc3RzWzZdWzJdID0gc3RyKCJcXHUzMEFDIikgOyAvLyBnYSAoS2F0YWthbmEpCgogIGNvbXBhdFRlc3RzWzddWzBdID0gc3RyKCJcXHUzMEFCXFx1MzA5OSIpOyBjb21wYXRUZXN0c1s3XVsxXSA9IHN0cigiXFx1MzBBQlxcdTMwOTkiKTsgY29tcGF0VGVzdHNbN11bMl0gPSBzdHIoIlxcdTMwQUMiKSA7IC8vIGthICsgdGVuCiAgCiAgY29tcGF0VGVzdHNbOF1bMF0gPSBzdHIoIlxcdUZGNzZcXHUzMDk5Iik7IGNvbXBhdFRlc3RzWzhdWzFdID0gc3RyKCJcXHUzMEFCXFx1MzA5OSIpOyBjb21wYXRUZXN0c1s4XVsyXSA9IHN0cigiXFx1MzBBQyIpIDsgLy8gaHdfa2EgKyB0ZW4KICAKICAvKiBUaGVzZSB0d28gYXJlIGJyb2tlbiBpbiBVbmljb2RlIDIuMS4yIGJ1dCBmaXhlZCBpbiAyLjEuNSBhbmQgbGF0ZXIgKi8KICBjb21wYXRUZXN0c1s5XVswXSA9IHN0cigiXFx1RkY3NlxcdUZGOUUiKTsgY29tcGF0VGVzdHNbOV1bMV0gPSBzdHIoIlxcdTMwQUJcXHUzMDk5Iik7IGNvbXBhdFRlc3RzWzldWzJdID0gc3RyKCJcXHUzMEFDIikgOyAvLyBod19rYSArIGh3X3RlbgoKICBjb21wYXRUZXN0c1sxMF1bMF0gPSBzdHIoIlxcdTMwQUJcXHVGRjlFIik7IGNvbXBhdFRlc3RzWzEwXVsxXSA9IHN0cigiXFx1MzBBQlxcdTMwOTkiKTsgY29tcGF0VGVzdHNbMTBdWzJdID0gc3RyKCJcXHUzMEFDIikgOyAvLyBrYSArIGh3X3RlbgoKICAvKiBIYW5ndWwgQ2Fub25pY2FsICovCiAgLy8gSW5wdXQgICAgICAgICAgICAgICAgICAgICAgICBEZWNvbXBvc2VkICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zZWQKICBoYW5ndWxDYW5vblswXVswXSA9IHN0cigiXFx1ZDRkYiIpOyBoYW5ndWxDYW5vblswXVsxXSA9IHN0cigiXFx1MTExMVxcdTExNzFcXHUxMWI2Iik7IGhhbmd1bENhbm9uWzBdWzJdID0gc3RyKCJcXHVkNGRiIikgOwoKICBoYW5ndWxDYW5vblsxXVswXSA9IHN0cigiXFx1MTExMVxcdTExNzFcXHUxMWI2IiksIGhhbmd1bENhbm9uWzFdWzFdID0gc3RyKCJcXHUxMTExXFx1MTE3MVxcdTExYjYiKSwgICBoYW5ndWxDYW5vblsxXVsyXSA9IHN0cigiXFx1ZDRkYiIpOwoKICAvKiBIYW5ndWwgQ29tcGF0aWJsZSAqLwogIC8vIElucHV0ICAgICAgICAgICAgRGVjb21wb3NlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2VkCiAgaGFuZ3VsQ29tcGF0WzBdWzBdID0gc3RyKCJcXHVkNGRiIik7IGhhbmd1bENvbXBhdFswXVsxXSA9IHN0cigiXFx1MTExMVxcdTExNmVcXHUxMTc1XFx1MTFhZlxcdTExYzIiKTsgaGFuZ3VsQ29tcGF0WzBdWzJdID0gc3RyKCJcXHVkNDc4XFx1MTE3NVxcdTExYWZcXHUxMWMyIik7Cn0KCkJhc2ljTm9ybWFsaXplclRlc3Q6On5CYXNpY05vcm1hbGl6ZXJUZXN0KCkKewp9Cgp2b2lkIEJhc2ljTm9ybWFsaXplclRlc3Q6OlRlc3RQcmV2aW91cygpIAp7CiAgTm9ybWFsaXplciogbm9ybSA9IG5ldyBOb3JtYWxpemVyKCIiLCBOb3JtYWxpemVyOjpERUNPTVAsIDApOwogIAogIGxvZ2xuKCJ0ZXN0aW5nIGRlY29tcC4uLiIpOwogIGludCBpOwogIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9MRU5HVEgoY2Fub25UZXN0cyk7IGkrKykgewogICAgYmFja0FuZEZvcnRoKG5vcm0sIGNhbm9uVGVzdHNbaV1bMF0pOwogIH0KICAKICBsb2dsbigidGVzdGluZyBjb21wb3NlLi4uIik7CiAgbm9ybS0+c2V0TW9kZShOb3JtYWxpemVyOjpDT01QT1NFKTsKICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfTEVOR1RIKGNhbm9uVGVzdHMpOyBpKyspIHsKICAgIGJhY2tBbmRGb3J0aChub3JtLCBjYW5vblRlc3RzW2ldWzBdKTsKICB9Cn0KCnZvaWQgQmFzaWNOb3JtYWxpemVyVGVzdDo6VGVzdERlY29tcCgpIAp7CiAgTm9ybWFsaXplciogbm9ybSA9IG5ldyBOb3JtYWxpemVyKCIiLCBOb3JtYWxpemVyOjpERUNPTVAsIDApOwogIGl0ZXJhdGVUZXN0KG5vcm0sIGNhbm9uVGVzdHMsIEFSUkFZX0xFTkdUSChjYW5vblRlc3RzKSwgMSk7CiAgCiAgc3RhdGljVGVzdChOb3JtYWxpemVyOjpERUNPTVAsIDAsIGNhbm9uVGVzdHMsIEFSUkFZX0xFTkdUSChjYW5vblRlc3RzKSwgMSk7Cn0KCnZvaWQgQmFzaWNOb3JtYWxpemVyVGVzdDo6VGVzdENvbXBhdERlY29tcCgpIAp7CiAgTm9ybWFsaXplciogbm9ybSA9IG5ldyBOb3JtYWxpemVyKCIiLCBOb3JtYWxpemVyOjpERUNPTVBfQ09NUEFULCAwKTsKICBpdGVyYXRlVGVzdChub3JtLCBjb21wYXRUZXN0cywgQVJSQVlfTEVOR1RIKGNvbXBhdFRlc3RzKSwgMSk7CiAgCiAgc3RhdGljVGVzdChOb3JtYWxpemVyOjpERUNPTVBfQ09NUEFULCAwLCAKICAgICAgICAgY29tcGF0VGVzdHMsIEFSUkFZX0xFTkdUSChjb21wYXRUZXN0cyksIDEpOwp9Cgp2b2lkIEJhc2ljTm9ybWFsaXplclRlc3Q6OlRlc3RDYW5vbkNvbXBvc2UoKSAKewogIE5vcm1hbGl6ZXIqIG5vcm0gPSBuZXcgTm9ybWFsaXplcigiIiwgTm9ybWFsaXplcjo6Q09NUE9TRSwgMCk7CiAgaXRlcmF0ZVRlc3Qobm9ybSwgY2Fub25UZXN0cywgQVJSQVlfTEVOR1RIKGNhbm9uVGVzdHMpLCAyKTsKICAKICBzdGF0aWNUZXN0KE5vcm1hbGl6ZXI6OkNPTVBPU0UsIDAsIGNhbm9uVGVzdHMsCiAgICAgICAgIEFSUkFZX0xFTkdUSChjYW5vblRlc3RzKSwgMik7Cn0KCnZvaWQgQmFzaWNOb3JtYWxpemVyVGVzdDo6VGVzdENvbXBhdENvbXBvc2UoKSAKewogIE5vcm1hbGl6ZXIqIG5vcm0gPSBuZXcgTm9ybWFsaXplcigiIiwgTm9ybWFsaXplcjo6Q09NUE9TRV9DT01QQVQsIDApOwogIGl0ZXJhdGVUZXN0KG5vcm0sIGNvbXBhdFRlc3RzLCBBUlJBWV9MRU5HVEgoY29tcGF0VGVzdHMpLCAyKTsKICAKICBzdGF0aWNUZXN0KE5vcm1hbGl6ZXI6OkNPTVBPU0VfQ09NUEFULCAwLCAKICAgICAgICAgY29tcGF0VGVzdHMsIEFSUkFZX0xFTkdUSChjb21wYXRUZXN0cyksIDIpOwp9CgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpVbmljb2RlU3RyaW5nIEJhc2ljTm9ybWFsaXplclRlc3Q6Omhhbmd1bENhbm9uWzJdWzNdOwoKVW5pY29kZVN0cmluZyBCYXNpY05vcm1hbGl6ZXJUZXN0OjpoYW5ndWxDb21wYXRbMV1bM107Cgp2b2lkIEJhc2ljTm9ybWFsaXplclRlc3Q6OlRlc3RIYW5ndWxDb21wb3NlKCkgCnsKICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgc3RhdGljIGNvbXBvc2l0aW9uIG1ldGhvZHMgd29yawogIGxvZ2xuKCJDYW5vbmljYWwgY29tcG9zaXRpb24uLi4iKTsKICBzdGF0aWNUZXN0KE5vcm1hbGl6ZXI6OkNPTVBPU0UsIDAsICAgICAgICAgICAgICAgICAgICBoYW5ndWxDYW5vbiwgIEFSUkFZX0xFTkdUSChoYW5ndWxDYW5vbiksICAyKTsKICBsb2dsbigiQ29tcGF0aWJpbGl0eSBjb21wb3NpdGlvbi4uLiIpOwogIHN0YXRpY1Rlc3QoTm9ybWFsaXplcjo6Q09NUE9TRV9DT01QQVQsIDAsICAgICAgICAgaGFuZ3VsQ29tcGF0LCBBUlJBWV9MRU5HVEgoaGFuZ3VsQ29tcGF0KSwgMik7CiAgCiAgLy8gTm93IHRyeSBpdGVyYXRpdmUgY29tcG9zaXRpb24uLi4uCiAgbG9nbG4oIlN0YXRpYyBjb21wb3NpdGlvbi4uLiIpOwogIE5vcm1hbGl6ZXIqIG5vcm0gPSBuZXcgTm9ybWFsaXplcigiIiwgTm9ybWFsaXplcjo6Q09NUE9TRSwgMCk7CiAgaXRlcmF0ZVRlc3Qobm9ybSwgaGFuZ3VsQ2Fub24sIEFSUkFZX0xFTkdUSChoYW5ndWxDYW5vbiksIDIpOwogIG5vcm0tPnNldE1vZGUoTm9ybWFsaXplcjo6Q09NUE9TRV9DT01QQVQpOwogIGl0ZXJhdGVUZXN0KG5vcm0sIGhhbmd1bENvbXBhdCwgQVJSQVlfTEVOR1RIKGhhbmd1bENvbXBhdCksIDIpOwogIAogIC8vIEFuZCBmaW5hbGx5LCBtYWtlIHN1cmUgeW91IGNhbiBkbyBpdCBpbiByZXZlcnNlIHRvbwogIGxvZ2xuKCJSZXZlcnNlIGl0ZXJhdGlvbi4uLiIpOwogIG5vcm0tPnNldE1vZGUoTm9ybWFsaXplcjo6Q09NUE9TRSk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBBUlJBWV9MRU5HVEgoaGFuZ3VsQ2Fub24pOyBpKyspIHsKICAgIGJhY2tBbmRGb3J0aChub3JtLCBoYW5ndWxDYW5vbltpXVswXSk7CiAgfQp9Cgp2b2lkIEJhc2ljTm9ybWFsaXplclRlc3Q6OlRlc3RIYW5ndWxEZWNvbXAoKSAKewogIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBzdGF0aWMgZGVjb21wb3NpdGlvbiBtZXRob2RzIHdvcmsKICBsb2dsbigiQ2Fub25pY2FsIGRlY29tcG9zaXRpb24uLi4iKTsKICBzdGF0aWNUZXN0KE5vcm1hbGl6ZXI6OkRFQ09NUCwgMCwgICAgICAgICAgICAgICAgICAgICBoYW5ndWxDYW5vbiwgIEFSUkFZX0xFTkdUSChoYW5ndWxDYW5vbiksICAxKTsKICBsb2dsbigiQ29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0aW9uLi4uIik7CiAgc3RhdGljVGVzdChOb3JtYWxpemVyOjpERUNPTVBfQ09NUEFULCAwLCAgICAgICAgIGhhbmd1bENvbXBhdCwgQVJSQVlfTEVOR1RIKGhhbmd1bENvbXBhdCksIDEpOwogIAogIC8vIE5vdyB0aGUgaXRlcmF0aXZlIGRlY29tcG9zaXRpb24gbWV0aG9kcy4uLgogIGxvZ2xuKCJJdGVyYXRpdmUgZGVjb21wb3NpdGlvbi4uLiIpOwogIE5vcm1hbGl6ZXIqIG5vcm0gPSBuZXcgTm9ybWFsaXplcigiIiwgTm9ybWFsaXplcjo6REVDT01QLCAwKTsKICBpdGVyYXRlVGVzdChub3JtLCBoYW5ndWxDYW5vbiwgQVJSQVlfTEVOR1RIKGhhbmd1bENhbm9uKSwgMSk7CiAgbm9ybS0+c2V0TW9kZShOb3JtYWxpemVyOjpERUNPTVBfQ09NUEFUKTsKICBpdGVyYXRlVGVzdChub3JtLCBoYW5ndWxDb21wYXQsIEFSUkFZX0xFTkdUSChoYW5ndWxDb21wYXQpLCAxKTsKICAKICAvLyBBbmQgZmluYWxseSwgbWFrZSBzdXJlIHlvdSBjYW4gZG8gaXQgaW4gcmV2ZXJzZSB0b28KICBsb2dsbigiUmV2ZXJzZSBpdGVyYXRpb24uLi4iKTsKICBub3JtLT5zZXRNb2RlKE5vcm1hbGl6ZXI6OkRFQ09NUCk7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBBUlJBWV9MRU5HVEgoaGFuZ3VsQ2Fub24pOyBpKyspIHsKICAgIGJhY2tBbmRGb3J0aChub3JtLCBoYW5ndWxDYW5vbltpXVswXSk7CiAgfQp9CgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSW50ZXJuYWwgdXRpbGl0aWVzCi8vCgpVbmljb2RlU3RyaW5nIEJhc2ljTm9ybWFsaXplclRlc3Q6OmhleChVQ2hhciBjaCkgewogICAgVW5pY29kZVN0cmluZyByZXN1bHQ7CiAgICByZXR1cm4gYXBwZW5kSGV4KGNoLCA0LCByZXN1bHQpOwp9CgpVbmljb2RlU3RyaW5nIEJhc2ljTm9ybWFsaXplclRlc3Q6OmhleChjb25zdCBVbmljb2RlU3RyaW5nJiBzKSB7CiAgICBVbmljb2RlU3RyaW5nIHJlc3VsdDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgKytpKSB7CiAgICAgICAgaWYgKGkgIT0gMCkgcmVzdWx0ICs9ICcsJzsKICAgICAgICBhcHBlbmRIZXgoc1tpXSwgNCwgcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn0KCgppbmxpbmUgc3RhdGljIHZvaWQgaW5zZXJ0KFVuaWNvZGVTdHJpbmcmIGRlc3QsIGludCBwb3MsIFVDaGFyIGNoKQp7CiAgICBkZXN0LnJlcGxhY2UocG9zLCAwLCAmY2gsIDEpOwp9Cgp2b2lkIEJhc2ljTm9ybWFsaXplclRlc3Q6OmJhY2tBbmRGb3J0aChOb3JtYWxpemVyKiBpdGVyLCBjb25zdCBVbmljb2RlU3RyaW5nJiBpbnB1dCkKewogICAgVUNoYXIgY2g7CiAgICBpdGVyLT5zZXRUZXh0KGlucHV0LCBzdGF0dXMpOwoKICAgIC8vIFJ1biB0aHJvdWdoIHRoZSBpdGVyYXRvciBmb3J3YXJkcyBhbmQgc3RpY2sgaXQgaW50byBhIFN0cmluZ0J1ZmZlcgogICAgVW5pY29kZVN0cmluZyBmb3J3YXJkOwogICAgZm9yIChjaCA9IGl0ZXItPmZpcnN0KCk7IGNoICE9IGl0ZXItPkRPTkU7IGNoID0gaXRlci0+bmV4dCgpKSB7CiAgICAgICAgZm9yd2FyZCArPSBjaDsKICAgIH0KCiAgICAvLyBOb3cgZG8gaXQgYmFja3dhcmRzCiAgICBVbmljb2RlU3RyaW5nIHJldmVyc2U7CiAgICBmb3IgKGNoID0gaXRlci0+bGFzdCgpOyBjaCAhPSBpdGVyLT5ET05FOyBjaCA9IGl0ZXItPnByZXZpb3VzKCkpIHsKICAgICAgICBpbnNlcnQocmV2ZXJzZSwgMCwgY2gpOwogICAgfQogICAgCiAgICBpZiAoZm9yd2FyZCAhPSByZXZlcnNlKSB7CiAgICAgICAgZXJybG4oIkZvcndhcmQvcmV2ZXJzZSBtaXNtYXRjaCBmb3IgaW5wdXQgIiArIGhleChpbnB1dCkKICAgICAgICAgICAgICArICIsIGZvcndhcmQ6ICIgKyBoZXgoZm9yd2FyZCkgKyAiLCBiYWNrd2FyZDogIiArIGhleChyZXZlcnNlKSk7CiAgICB9Cn0KCnZvaWQgQmFzaWNOb3JtYWxpemVyVGVzdDo6c3RhdGljVGVzdChOb3JtYWxpemVyOjpFTW9kZSBtb2RlLCBpbnQgb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyB0ZXN0c1tdWzNdLCBpbnQgbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICBpbnQgb3V0Q29sKQp7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQogICAgewogICAgICAgIFVuaWNvZGVTdHJpbmcmIGlucHV0ID0gdGVzdHNbaV1bMF07CiAgICAgICAgVW5pY29kZVN0cmluZyYgZXhwZWN0ID0gdGVzdHNbaV1bb3V0Q29sXTsKICAgICAgICAKICAgICAgICBsb2dsbigiTm9ybWFsaXppbmcgJyIgKyBpbnB1dCArICInICgiICsgaGV4KGlucHV0KSArICIpIiApOwogICAgICAgIAogICAgICAgIFVuaWNvZGVTdHJpbmcgb3V0cHV0OwogICAgICAgIE5vcm1hbGl6ZXI6Om5vcm1hbGl6ZShpbnB1dCwgbW9kZSwgb3B0aW9ucywgb3V0cHV0LCBzdGF0dXMpOwogICAgICAgIAogICAgICAgIGlmIChvdXRwdXQgIT0gZXhwZWN0KSB7CiAgICAgICAgICAgIGVycmxuKFVuaWNvZGVTdHJpbmcoIkVSUk9SOiBjYXNlICIpICsgaSArICIgbm9ybWFsaXplZCAiICsgaGV4KGlucHV0KSArICJcbiIKICAgICAgICAgICAgICAgICsgIiAgICAgICAgICAgICAgICBleHBlY3RlZCAiICsgaGV4KGV4cGVjdCkgKyAiXG4iCiAgICAgICAgICAgICAgICArICIgICAgICAgICAgICAgIHN0YXRpYyBnb3QgIiArIGhleChvdXRwdXQpICk7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIEJhc2ljTm9ybWFsaXplclRlc3Q6Oml0ZXJhdGVUZXN0KE5vcm1hbGl6ZXIqIGl0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyB0ZXN0c1tdWzNdLCBpbnQgbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRDb2wpCnsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCiAgICB7CiAgICAgICAgVW5pY29kZVN0cmluZyYgaW5wdXQgPSB0ZXN0c1tpXVswXTsKICAgICAgICBVbmljb2RlU3RyaW5nJiBleHBlY3QgPSB0ZXN0c1tpXVtvdXRDb2xdOwogICAgICAgIAogICAgICAgIGxvZ2xuKCJOb3JtYWxpemluZyAnIiArIGlucHV0ICsgIicgKCIgKyBoZXgoaW5wdXQpICsgIikiICk7CiAgICAgICAgCiAgICAgICAgaXRlci0+c2V0VGV4dChpbnB1dCwgc3RhdHVzKTsKICAgICAgICBhc3NlcnRFcXVhbChpbnB1dCwgZXhwZWN0LCBpdGVyLCBVbmljb2RlU3RyaW5nKCJFUlJPUjogY2FzZSAiKSArIGkgKyAiICIpOwogICAgfQp9Cgp2b2lkIEJhc2ljTm9ybWFsaXplclRlc3Q6OmFzc2VydEVxdWFsKGNvbnN0IFVuaWNvZGVTdHJpbmcmICAgIGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5pY29kZVN0cmluZyYgICAgZXhwZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxpemVyKiAgICAgICAgaXRlciwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaWNvZGVTdHJpbmcmICAgIGVyclByZWZpeCkKewogICAgaW50IGluZGV4ID0gMDsKICAgIFVuaWNvZGVTdHJpbmcgcmVzdWx0OwoKICAgIGZvciAoVUNoYXIgY2ggPSBpdGVyLT5maXJzdCgpOyBjaCAhPSBpdGVyLT5ET05FOyBjaCA9IGl0ZXItPm5leHQoKSkgewogICAgICAgIHJlc3VsdCArPSBjaDsKICAgIH0KICAgIGlmIChyZXN1bHQgIT0gZXhwZWN0ZWQpIHsKICAgICAgICBlcnJsbihlcnJQcmVmaXggKyAibm9ybWFsaXplZCAiICsgaGV4KGlucHV0KSArICJcbiIKICAgICAgICAgICAgKyAiICAgICAgICAgICAgICAgIGV4cGVjdGVkICIgKyBoZXgoZXhwZWN0ZWQpICsgIlxuIgogICAgICAgICAgICArICIgICAgICAgICAgICAgaXRlcmF0ZSBnb3QgIiArIGhleChyZXN1bHQpICk7CiAgICB9Cn0KCnZvaWQgQmFzaWNOb3JtYWxpemVyVGVzdDo6cnVuSW5kZXhlZFRlc3QoaW50MzJfdCBpbmRleCwgYm9vbF90IGV4ZWMsIGNoYXIqICZuYW1lLCBjaGFyKiBwYXIpCnsKICAgIGlmIChleGVjKQogICAgewogICAgICAgIGxvZ2xuKCJDb2xsYXRpb24gUmVncmVzc2lvbiBUZXN0czogIik7CiAgICB9CgogICAgc3dpdGNoIChpbmRleCkKICAgIHsKICAgICAgICBjYXNlICAwOiBuYW1lID0gIlRlc3REZWNvbXAiOyAgICAgICAgICAgIGlmIChleGVjKSBUZXN0RGVjb21wKCk7IGJyZWFrOwogICAgICAgIGNhc2UgIDE6IG5hbWUgPSAiVGVzdENvbXBhdERlY29tcCI7ICAgICAgICBpZiAoZXhlYykgVGVzdENvbXBhdERlY29tcCgpOyBicmVhazsKICAgICAgICBjYXNlICAyOiBuYW1lID0gIlRlc3RDYW5vbkNvbXBvc2UiOyAgICAgICAgaWYgKGV4ZWMpIFRlc3RDYW5vbkNvbXBvc2UoKTsgYnJlYWs7CiAgICAgICAgY2FzZSAgMzogbmFtZSA9ICJUZXN0Q29tcGF0Q29tcG9zZSI7ICAgIGlmIChleGVjKSBUZXN0Q29tcGF0Q29tcG9zZSgpOyBicmVhazsKICAgICAgICBjYXNlICA0OiBuYW1lID0gIlRlc3RQcmV2aW91cyI7ICAgICAgICAgICAgaWYgKGV4ZWMpIFRlc3RQcmV2aW91cygpOyBicmVhazsKICAgICAgICBjYXNlICA1OiBuYW1lID0gIlRlc3RIYW5ndWxEZWNvbXAiOyAgICAgICAgaWYgKGV4ZWMpIFRlc3RIYW5ndWxEZWNvbXAoKTsgYnJlYWs7CiAgICAgICAgY2FzZSAgNjogbmFtZSA9ICJUZXN0SGFuZ3VsQ29tcG9zZSI7ICAgIGlmIChleGVjKSBUZXN0SGFuZ3VsQ29tcG9zZSgpOyBicmVhazsKICAgICAgICBkZWZhdWx0OiBuYW1lID0gIiI7IGJyZWFrOwogICAgfQp9Cg==