LyoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5pbWFnaW5nLmZvcm1hdHMucHNkOwoKaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pbWFnaW5nLnV0aWwuRGVidWc7CgpwdWJsaWMgY2xhc3MgUHNkQ29uc3RhbnRzCnsKICAgIHN0YXRpYyBmaW5hbCBJbWFnZVJlc291cmNlVHlwZSBmSW1hZ2VSZXNvdXJjZVR5cGVzW107CgogICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihpbnQgaWQpCiAgICB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmSW1hZ2VSZXNvdXJjZVR5cGVzLmxlbmd0aDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGZJbWFnZVJlc291cmNlVHlwZXNbaV0uSUQgPT0gaWQpCiAgICAgICAgICAgICAgICByZXR1cm4gZkltYWdlUmVzb3VyY2VUeXBlc1tpXS5EZXNjcmlwdGlvbjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJVbmtub3duIjsKICAgIH0KCiAgICBzdGF0aWMKICAgIHsKICAgICAgICBJbWFnZVJlc291cmNlVHlwZSB0ZW1wW10gPSBudWxsOwoKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHRlbXAgPSBuZXcgSW1hZ2VSZXNvdXJjZVR5cGVbXXsKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzRTgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBDb250YWlucyBmaXZlIDIgYnl0ZSB2YWx1ZXM6IG51bWJlciBvZiBjaGFubmVscywgcm93cywgY29sdW1ucywgZGVwdGgsIGFuZCBtb2RlLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgweDAzRTksIDEwMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3B0aW9uYWwuIE1hY2ludG9zaCBwcmludCBtYW5hZ2VyIHByaW50IGluZm8gcmVjb3JkLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgweDAzRUIsIDEwMDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIENvbnRhaW5zIHRoZSBpbmRleGVkIGNvbG9yIHRhYmxlLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgweDAzRUQsIDEwMDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzb2x1dGlvbkluZm8gc3RydWN0dXJlLiBTZWUgQXBwZW5kaXggQSBpbiBQaG90b3Nob3AgU0RLIEd1aWRlLnBkZi4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoMHgwM0VFLCAxMDA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVzIG9mIHRoZSBhbHBoYSBjaGFubmVscyBhcyBhIHNlcmllcyBvZiBQYXNjYWwgc3RyaW5ncy4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoMHgwM0VGLCAxMDA3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc3BsYXlJbmZvIHN0cnVjdHVyZS4gU2VlIEFwcGVuZGl4IEEgaW4gUGhvdG9zaG9wIFNESyBHdWlkZS5wZGYgLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgweDAzRjAsIDEwMDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3B0aW9uYWwuIFRoZSBjYXB0aW9uIGFzIGEgUGFzY2FsIHN0cmluZy4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzRjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvcmRlciBpbmZvcm1hdGlvbi4gQ29udGFpbnMgYSBmaXhlZC1udW1iZXIgZm9yIHRoZSBib3JkZXIgd2lkdGgsIGFuZCAyIGJ5dGVzIGZvciBib3JkZXIgdW5pdHMgKDE9aW5jaGVzLCAyPWNtLCAzPXBvaW50cywgND1waWNhcywgNT1jb2x1bW5zKS4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoMHgwM0YyLCAxMDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhY2tncm91bmQgY29sb3IuIFNlZSB0aGUgQ29sb3JzIGFkZGl0aW9uYWwgZmlsZSBpbmZvcm1hdGlvbi4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzRjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW50IGZsYWdzLiBBIHNlcmllcyBvZiBvbmUgYnl0ZSBib29sZWFuIHZhbHVlcyAoc2VlIFBhZ2UgU2V0dXAgZGlhbG9nKTogbGFiZWxzLCBjcm9wIG1hcmtzLCBjb2xvciBiYXJzLCByZWdpc3RyYXRpb24gbWFya3MsIG5lZ2F0aXZlLCBmbGlwLCBpbnRlcnBvbGF0ZSwgY2FwdGlvbi4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoMHgwM0Y0LCAxMDEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdyYXlzY2FsZSBhbmQgbXVsdGljaGFubmVsIGhhbGZ0b25pbmcgaW5mb3JtYXRpb24uIiksCiAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlUmVzb3VyY2VUeXBlKDB4MDNGNSwgMTAxMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2xvciBoYWxmdG9uaW5nIGluZm9ybWF0aW9uLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgweDAzRjYsIDEwMTQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVvdG9uZSBoYWxmdG9uaW5nIGluZm9ybWF0aW9uLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgweDAzRjcsIDEwMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR3JheXNjYWxlIGFuZCBtdWx0aWNoYW5uZWwgdHJhbnNmZXIgZnVuY3Rpb24uIiksCiAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlUmVzb3VyY2VUeXBlKDB4MDNGOCwgMTAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2xvciB0cmFuc2ZlciBmdW5jdGlvbnMuIiksCiAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlUmVzb3VyY2VUeXBlKDB4MDNGOSwgMTAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEdW90b25lIHRyYW5zZmVyIGZ1bmN0aW9ucy4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoMHgwM0ZBLCAxMDE4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1b3RvbmUgaW1hZ2UgaW5mb3JtYXRpb24uIiksCiAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlUmVzb3VyY2VUeXBlKDB4MDNGQiwgMTAxOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUd28gYnl0ZXMgZm9yIHRoZSBlZmZlY3RpdmUgYmxhY2sgYW5kIHdoaXRlIHZhbHVlcyBmb3IgdGhlIGRvdCByYW5nZS4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoMHgwM0ZDLCAxMDIwLCAiT2Jzb2xldGUuIiksCiAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlUmVzb3VyY2VUeXBlKDB4MDNGRCwgMTAyMSwgIkVQUyBvcHRpb25zLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDNGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXVpY2sgTWFzayBpbmZvcm1hdGlvbi4gMiBieXRlcyBjb250YWluaW5nIFF1aWNrIE1hc2sgY2hhbm5lbCBJRCwgMSBieXRlIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXNrIHdhcyBpbml0aWFsbHkgZW1wdHkuIiksCiAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlUmVzb3VyY2VUeXBlKDB4MDNGRiwgMTAyMywgIk9ic29sZXRlLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF5ZXIgc3RhdGUgaW5mb3JtYXRpb24uIDIgYnl0ZXMgY29udGFpbmluZyB0aGUgaW5kZXggb2YgdGFyZ2V0IGxheWVyLiAwPWJvdHRvbSBsYXllci4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoMHgwNDAxLCAxMDI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIldvcmtpbmcgcGF0aCAobm90IHNhdmVkKS4gU2VlIHBhdGggcmVzb3VyY2UgZm9ybWF0IGxhdGVyIGluIHRoaXMgY2hhcHRlci4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxheWVycyBncm91cCBpbmZvcm1hdGlvbi4gMiBieXRlcyBwZXIgbGF5ZXIgY29udGFpbmluZyBhIGdyb3VwIElEIGZvciB0aGUgZHJhZ2dpbmcgZ3JvdXBzLiBMYXllcnMgaW4gYSBncm91cCBoYXZlIHRoZSBzYW1lIGdyb3VwIElELiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgweDA0MDMsIDEwMjcsICJPYnNvbGV0ZS4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIklQVEMtTkFBIHJlY29yZC4gVGhpcyBjb250YWlucyB0aGUgRmlsZSBJbmZvLi4uIGluZm9ybWF0aW9uLiBTZWUgdGhlIElJTVY0LnBkZiBkb2N1bWVudC4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoMHgwNDA1LCAxMDI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkltYWdlIG1vZGUgZm9yIHJhdyBmb3JtYXQgZmlsZXMuIiksCiAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlUmVzb3VyY2VUeXBlKDB4MDQwNiwgMTAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUEVHIHF1YWxpdHkuIFByaXZhdGUuIiksCiAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlUmVzb3VyY2VUeXBlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHcmlkIGFuZCBndWlkZXMgaW5mb3JtYXRpb24uIFNlZSBncmlkIGFuZCBndWlkZXMgcmVzb3VyY2UgZm9ybWF0IGxhdGVyIGluIHRoaXMgY2hhcHRlci4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoMHgwNDA5LCAxMDMzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRodW1ibmFpbCByZXNvdXJjZS4gU2VlIHRodW1ibmFpbCByZXNvdXJjZSBmb3JtYXQgbGF0ZXIgaW4gdGhpcyBjaGFwdGVyLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29weXJpZ2h0IGZsYWcuIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGltYWdlIGlzIGNvcHlyaWdodGVkLiBDYW4gYmUgc2V0IHZpYSBQcm9wZXJ0eSBzdWl0ZSBvciBieSB1c2VyIGluIEZpbGUgSW5mby4uLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMzUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVJMLiBIYW5kbGUgb2YgYSB0ZXh0IHN0cmluZyB3aXRoIHVuaWZvcm0gcmVzb3VyY2UgbG9jYXRvci4gQ2FuIGJlIHNldCB2aWEgUHJvcGVydHkgc3VpdGUgb3IgYnkgdXNlciBpbiBGaWxlIEluZm8uLi4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoMHgwNDBDLCAxMDM2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRodW1ibmFpbCByZXNvdXJjZS4gU2VlIHRodW1ibmFpbCByZXNvdXJjZSBmb3JtYXQgbGF0ZXIgaW4gdGhpcyBjaGFwdGVyLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2xvYmFsIEFuZ2xlLiA0IGJ5dGVzIHRoYXQgY29udGFpbiBhbiBpbnRlZ2VyIGJldHdlZW4gMC4uMzU5IHdoaWNoIGlzIHRoZSBnbG9iYWwgbGlnaHRpbmcgYW5nbGUgZm9yIGVmZmVjdHMgbGF5ZXIuIElmIG5vdCBwcmVzZW50IGFzc3VtZXMgMzAuIiksCiAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlUmVzb3VyY2VUeXBlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAzOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2xvciBzYW1wbGVycyByZXNvdXJjZS4gU2VlIGNvbG9yIHNhbXBsZXJzIHJlc291cmNlIGZvcm1hdCBsYXRlciBpbiB0aGlzIGNoYXB0ZXIuIiksCiAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlUmVzb3VyY2VUeXBlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDBGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJQ0MgUHJvZmlsZS4gVGhlIHJhdyBieXRlcyBvZiBhbiBJQ0MgZm9ybWF0IHByb2ZpbGUsIHNlZSB0aGUgSUNDMzQucGRmIGFuZCBJQ0MzNC5oIGZpbGVzIGZyb20gdGhlIEludGVybmF0aW9uIENvbG9yIENvbnNvcnRpdW0gbG9jYXRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBzZWN0aW9uLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgweDA0MTAsIDEwNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT25lIGJ5dGUgZm9yIFdhdGVybWFyay4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIklDQyBVbnRhZ2dlZC4gMSBieXRlIHRoYXQgZGlzYWJsZXMgYW55IGFzc3VtZWQgcHJvZmlsZSBoYW5kbGluZyB3aGVuIG9wZW5pbmcgdGhlIGZpbGUuIDEgPSBpbnRlbnRpb25hbGx5IHVudGFnZ2VkLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWZmZWN0cyB2aXNpYmxlLiAxIGJ5dGUgZ2xvYmFsIGZsYWcgdG8gc2hvdy9oaWRlIGFsbCB0aGUgZWZmZWN0cyBsYXllci4gT25seSBwcmVzZW50IHdoZW4gdGhleSBhcmUgaGlkZGVuLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQxMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3BvdCBIYWxmdG9uZS4gNCBieXRlcyBmb3IgdmVyc2lvbiwgNCBieXRlcyBmb3IgbGVuZ3RoLCBhbmQgdGhlIHZhcmlhYmxlIGxlbmd0aCBkYXRhLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQxNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9jdW1lbnQgc3BlY2lmaWMgSURzLCBsYXllciBJRHMgd2lsbCBiZSBnZW5lcmF0ZWQgc3RhcnRpbmcgYXQgdGhpcyBiYXNlIHZhbHVlIG9yIGEgZ3JlYXRlciB2YWx1ZSBpZiB3ZSBmaW5kIGV4aXN0aW5nIElEcyB0byBhbHJlYWR5IGV4Y2VlZCBpdC4gSXSScyBwdXJwb3NlIGlzIHRvIGF2b2lkIHRoZSBjYXNlIHdoZXJlIHdlIGFkZCBsYXllcnMsIGZsYXR0ZW4sIHNhdmUsIG9wZW4sIGFuZCB0aGVuIGFkZCBtb3JlIGxheWVycyB0aGF0IGVuZCB1cCB3aXRoIHRoZSBzYW1lIElEcyBhcyB0aGUgZmlyc3Qgc2V0LiA0IGJ5dGVzLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgweDA0MTUsIDEwNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5pY29kZSBBbHBoYSBOYW1lcy4gNCBieXRlcyBmb3IgbGVuZ3RoIGFuZCB0aGUgc3RyaW5nIGFzIGEgdW5pY29kZSBzdHJpbmcuIiksCiAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlUmVzb3VyY2VUeXBlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmRleGVkIENvbG9yIFRhYmxlIENvdW50LiAyIGJ5dGVzIGZvciB0aGUgbnVtYmVyIG9mIGNvbG9ycyBpbiB0YWJsZSB0aGF0IGFyZSBhY3R1YWxseSBkZWZpbmVkIiksCiAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlUmVzb3VyY2VUeXBlKDB4MDQxNywgMTA0NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUYW5zcGFyZW50IEluZGV4LiAyIGJ5dGVzIGZvciB0aGUgaW5kZXggb2YgdHJhbnNwYXJlbnQgY29sb3IsIGlmIGFueS4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoMHgwNDE5LCAxMDQ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdsb2JhbCBBbHRpdHVkZS4gNCBieXRlIGVudHJ5IGZvciBhbHRpdHVkZSIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgweDA0MUEsIDEwNTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2xpY2VzLiBTZWUgZGVzY3JpcHRpb24gbGF0ZXIgaW4gdGhpcyBjaGFwdGVyIiksCiAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlUmVzb3VyY2VUeXBlKDB4MDQxQiwgMTA1MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXb3JrZmxvdyBVUkwuIFVuaWNvZGUgc3RyaW5nLCA0IGJ5dGVzIG9mIGxlbmd0aCBmb2xsb3dlZCBieSB1bmljb2RlIHN0cmluZy4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDUyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkp1bXAgVG8gWFBFUC4gMiBieXRlcyBtYWpvciB2ZXJzaW9uLCAyIGJ5dGVzIG1pbm9yIHZlcnNpb24sIDQgYnl0ZXMgY291bnQuIEZvbGxvd2luZyBpcyByZXBlYXRlZCBmb3IgY291bnQ6IDQgYnl0ZXMgYmxvY2sgc2l6ZSwgNCBieXRlcyBrZXksIGlmIGtleSA9ICdqdERkJyB0aGVuIG5leHQgaXMgYSBCb29sZWFuIGZvciB0aGUgZGlydHkgZmxhZyBvdGhlcndpc2UgaXSScyBhIDQgYnl0ZSBlbnRyeSBmb3IgdGhlIG1vZCBkYXRlLiIpLAogICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZVJlc291cmNlVHlwZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQxRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxwaGEgSWRlbnRpZmllcnMuIDQgYnl0ZXMgb2YgbGVuZ3RoLCBmb2xsb3dlZCBieSA0IGJ5dGVzIGVhY2ggZm9yIGV2ZXJ5IGFscGhhIGlkZW50aWZpZXIuIiksCiAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlUmVzb3VyY2VUeXBlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDFFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA1NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVUkwgTGlzdC4gNCBieXRlIGNvdW50IG9mIFVSTHMsIGZvbGxvd2VkIGJ5IDQgYnl0ZSBsb25nLCA0IGJ5dGUgSUQsIGFuZCB1bmljb2RlIHN0cmluZyBmb3IgZWFjaCBjb3VudC4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDU3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZlcnNpb24gSW5mby4gNCBieXRlIHZlcnNpb24sIDEgYnl0ZSBIYXNSZWFsTWVyZ2VkRGF0YSwgdW5pY29kZSBzdHJpbmcgb2Ygd3JpdGVyIG5hbWUsIHVuaWNvZGUgc3RyaW5nIG9mIHJlYWRlciBuYW1lLCA0IGJ5dGVzIG9mIGZpbGUgdmVyc2lvbi4iKSwKICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VSZXNvdXJjZVR5cGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3RDAgLSAweDBCQjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAwIC0gMjk5OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYXRoIEluZm9ybWF0aW9uIChzYXZlZCBwYXRocykuIFNlZSBwYXRoIHJlc291cmNlIGZvcm1hdCBsYXRlciBpbiB0aGlzIGNoYXB0ZXIuIiksCiAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlUmVzb3VyY2VUeXBlKDB4MEJCNywgMjk5OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lIG9mIGNsaXBwaW5nIHBhdGguIFNlZSBwYXRoIHJlc291cmNlIGZvcm1hdCBsYXRlciBpbiB0aGlzIGNoYXB0ZXIuIiksCiAgICAgICAgICAgICAgICAgICAgbmV3IEltYWdlUmVzb3VyY2VUeXBlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNzEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbnQgZmxhZ3MgaW5mb3JtYXRpb24uIDIgYnl0ZXMgdmVyc2lvbiAoPTEpLCAxIGJ5dGUgY2VudGVyIGNyb3AgbWFya3MsIDEgYnl0ZSAoPTApLCA0IGJ5dGVzIGJsZWVkIHdpZHRoIHZhbHVlLCAyIGJ5dGVzIGJsZWVkIHdpZHRoIHNjYWxlLiIpLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgewogICAgICAgICAgICBEZWJ1Zy5kZWJ1ZyhQc2RDb25zdGFudHMuY2xhc3MsIGUpOwogICAgICAgIH0KICAgICAgICBmSW1hZ2VSZXNvdXJjZVR5cGVzID0gdGVtcDsKICAgIH0KfQ==