LyoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgp1c2luZyBTeXN0ZW07CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmc7CnVzaW5nIEFwYWNoZS5OTVMuUG9saWNpZXM7CnVzaW5nIEFwYWNoZS5OTVMuVGVzdDsKdXNpbmcgTlVuaXQuRnJhbWV3b3JrOwoKbmFtZXNwYWNlIEFwYWNoZS5OTVMuU3RvbXAuVGVzdAp7CiAgICBbVGVzdEZpeHR1cmVdCiAgICBwdWJsaWMgY2xhc3MgU3BlY2lhbENoYXJhY3RlcnNUZXN0IDogTk1TVGVzdFN1cHBvcnQKICAgIHsKICAgICAgICBwcml2YXRlIENvbm5lY3Rpb24gY29ubmVjdGlvbjsKICAgICAgICBwcml2YXRlIElTZXNzaW9uIHNlc3Npb247CgogICAgICAgIFtTZXRVcF0KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRVcCgpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSAoQ29ubmVjdGlvbikgQ3JlYXRlQ29ubmVjdGlvbigpOwogICAgICAgIH0KCiAgICAgICAgW1RlYXJEb3duXQogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFRlYXJEb3duKCkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbiA9IG51bGw7CgogICAgICAgICAgICBpZih0aGlzLmNvbm5lY3Rpb24gIT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLkNsb3NlKCk7CiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBiYXNlLlRlYXJEb3duKCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIFtUZXN0XQogICAgICAgIHB1YmxpYyB2b2lkIFRlc3RTcGVjaWFsQ2hhcmFjdGVycygpCiAgICAgICAgewogICAgICAgICAgICBzdHJpbmcgbWVzc2FnZSA9ICJTcGVjaWFsIGNoYXJhY3RlcnM6IOIg6CD0IPwg9iDzIPEiOwogICAgICAgICAgICBjb25uZWN0aW9uLlN0YXJ0KCk7CgogICAgICAgICAgICB0aGlzLnNlc3Npb24gPSBjb25uZWN0aW9uLkNyZWF0ZVNlc3Npb24oQWNrbm93bGVkZ2VtZW50TW9kZS5BdXRvQWNrbm93bGVkZ2UpOwogICAgICAgICAgICBJVGVtcG9yYXJ5UXVldWUgcXVldWUgPSBzZXNzaW9uLkNyZWF0ZVRlbXBvcmFyeVF1ZXVlKCk7CiAgICAgICAgICAgIElNZXNzYWdlUHJvZHVjZXIgcHJvZHVjZXIgPSBzZXNzaW9uLkNyZWF0ZVByb2R1Y2VyKHF1ZXVlKTsKICAgICAgICAgICAgSU1lc3NhZ2VDb25zdW1lciBjb25zdW1lciA9IHNlc3Npb24uQ3JlYXRlQ29uc3VtZXIocXVldWUpOwoKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gc2VuZCB0aGUgbWVzc2FnZQogICAgICAgICAgICBJTWVzc2FnZSB0ZXh0TWVzc2FnZSA9IHNlc3Npb24uQ3JlYXRlVGV4dE1lc3NhZ2UobWVzc2FnZSk7CiAgICAgICAgICAgIHByb2R1Y2VyLlNlbmQodGV4dE1lc3NhZ2UpOwoKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gd2FpdCBmb3IgdGhlIHJlc3BvbnNlCiAgICAgICAgICAgIElUZXh0TWVzc2FnZSBtZXNzYWdlUmVjZWl2ZSA9IChJVGV4dE1lc3NhZ2UpIGNvbnN1bWVyLlJlY2VpdmUoVGltZVNwYW4uRnJvbU1pbGxpc2Vjb25kcygxMDAwMCkpOwogICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZSwgbWVzc2FnZVJlY2VpdmUuVGV4dCk7CgogICAgICAgICAgICBzZXNzaW9uLkNsb3NlKCk7CiAgICAgICAgfQogICAgfQp9Cg==