LyoKICogR2VybWFuIHJlc291cmNlcyBmb3IgVHdhaW4KICoKICogQ29weXJpZ2h0IDIwMDYgRnJhbmsgUmljaHRlcgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0dFUk1BTiwgU1VCTEFOR19ORVVUUkFMCgpJRERfQ0FNRVJBVUkgRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAzNzIsIDI3MwpTVFlMRSBEU19NT0RBTEZSQU1FIHwgRFNfU0VURk9SRUdST1VORCB8IERTX0NFTlRFUiB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IAogICAgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiRGF0ZWllbiBhdWYgZGVyIEthbWVyYSIKTUVOVSAyMDU0NQpGT05UIDgsICJNUyBTYW5zIFNlcmlmIgpCRUdJTgoJQ09OVFJPTCAgICAgICAgICJMaXN0MSIsSURDX0xJU1QxLCJTeXNMaXN0VmlldzMyIiwgTFZTX0lDT04gfCBXU19CT1JERVIgfApXU19UQUJTVE9QLDcsNywzNTgsMjI5CiAgICBERUZQVVNIQlVUVE9OICAgIkdld+RobHRlIGltcG9ydGllcmVuIixJRENfSU1QT1JULDIyNSwyNTIsNTYsMTQKICAgIFBVU0hCVVRUT04gICAgICAiQWxsZSBpbXBvcnRpZXJlbiIsSURDX0lNUE9SVEFMTCw3LDI1Miw1MiwxNAogICAgUFVTSEJVVFRPTiAgICAgICJCZWVuZGVuIixJRENfRVhJVCwyOTUsMjUyLDUwLDE0CkVORAoKSUREX0RJQUxPRzEgRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDE4NiwgNDYKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUgfCBXU19WSVNJQkxFIHwgRFNfQ0VOVEVSIHwgRFNfU0VURk9SRUdST1VORApDQVBUSU9OICLcYmVydHJhZ3VuZyIKRk9OVCA4LCAiTVMgU2FucyBTZXJpZiIKQkVHSU4KICAgIExURVhUICAgItxiZXJ0cmFnZS4uLiBCaXR0ZSBXYXJ0ZW4iLElEQ19TVEFUSUMsNSwxOSwxNzYsOCwgU1NfQ0VOVEVSCkVORAoKSUREX0NPTk5FQ1RJTkcgRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAyODAsIDExNgpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVXwgV1NfVklTSUJMRSB8IERTX0NFTlRFUgpDQVBUSU9OICJWZXJiaW5kZSBtaXQgS2FtZXJhIgpGT05UIDgsICJNUyBTYW5zIFNlcmlmIgpCRUdJTgogICAgQ09OVFJPTCAgICAgICAgICIiLElEQ19CSVRNQVAsIlN0YXRpYyIsU1NfQklUTUFQfFNTX0NFTlRFUklNQUdFLDQsNCwxMTAsMTEwCiAgICBMVEVYVCAgICAgICAgICAgIlZlcmJpbmRlIG1pdCBLYW1lcmEuLi4gQml0dGUgV2FydGVuIixJRENfU1RBVElDLDEyOCw1OCwKICAgICAgICAgICAgICAgICAgICAxMTYsOApFTkQK