LyoKICogQ29weXJpZ2h0IDE5OTkgRXJpYyBLb2hsCiAqIENvcHlyaWdodCAyMDAyIEphY2VrIEJhdG9yCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfUE9MSVNILCBTVUJMQU5HX0RFRkFVTFQKCklERF9QUk9QU0hFRVQgRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDIyMCwgMTQwClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VIHwgV1NfVklTSUJMRQpDQVBUSU9OICJXs2GcY2l3b5xjaSAiCkZPTlQgOCwgIk1TIFNhbnMgU2VyaWYiCkJFR0lOCiAgREVGUFVTSEJVVFRPTiAiT0siLCAgICAgSURPSyw0LDEyMiw1MCwxNCwgV1NfVEFCU1RPUCB8IFdTX0dST1VQCiAgUFVTSEJVVFRPTiAgICAiQW51bHVqIiwgSURDQU5DRUwsNTgsMTIyLDUwLDE0CiAgUFVTSEJVVFRPTiAgICAiJlphc3Rvc3VqIiwgSURDX0FQUExZX0JVVFRPTiwxMTIsMTIyLDUwLDE0LFdTX0RJU0FCTEVECiAgUFVTSEJVVFRPTiAgICAiUG9tb2MiLCAgIElESEVMUCwxNjYsMTIyLDUwLDE0LFdTX1RBQlNUT1B8V1NfR1JPVVAKICBDT05UUk9MICAgICAgICJUYWIiLCAgICBJRENfVEFCQ09OVFJPTCwiU3lzVGFiQ29udHJvbDMyIixXU19DTElQU0lCTElOR1N8V1NfR1JPVVB8V1NfVEFCU1RPUCw0LDQsMjEyLDExNApFTkQKCgpJRERfV0laQVJEIERJQUxPRyBESVNDQVJEQUJMRSAwLCAwLCAyOTAsIDE1OQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVSB8IFdTX1ZJU0lCTEUKQ0FQVElPTiAiS3JlYXRvciIKRk9OVCA4LCAiTVMgU2FucyBTZXJpZiIKQkVHSU4KICBERUZQVVNIQlVUVE9OICJaYWtv8WN6IiwgIElEQ19GSU5JU0hfQlVUVE9OLDEyMSwxMzgsNTAsMTQKICBERUZQVVNIQlVUVE9OICImRGFsZWogPiIsIElEQ19ORVhUX0JVVFRPTiwxMjEsMTM4LDUwLDE0CiAgUFVTSEJVVFRPTiAgICAiPCAmV3N0ZWN6IiwgSURDX0JBQ0tfQlVUVE9OLDcxLDEzOCw1MCwxNAogIFBVU0hCVVRUT04gICAgIkFudWx1aiIsICBJRENBTkNFTCwxNzgsMTM4LDUwLDE0CiAgUFVTSEJVVFRPTiAgICAiUG9tb2MiLCAgICBJREhFTFAsMjM1LDEzOCw1MCwxNCxXU19HUk9VUAogIExURVhUICAgICAgICAgIiIsICAgICAgICBJRENfU1VOS0VOX0xJTkUsNywxMjksMjc4LDEsU1NfU1VOS0VOCiAgQ09OVFJPTCAgICAgICAiVGFiIiwgICAgIElEQ19UQUJDT05UUk9MLCJTeXNUYWJDb250cm9sMzIiLFdTX0NMSVBTSUJMSU5HUyB8IFdTX0RJU0FCTEVELDcsNywyNTgsNQpFTkQKCgpJRERfVEJDVVNUT01JWkUgRElBTE9HIERJU0NBUkRBQkxFIDEwLCAyMCwgMzU3LCAxMjUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIkRvc3Rvc293eXdhbmllIHBhc2thIG5hcnrqZHppIgpGT05UIDgsICJNUyBTYW5zIFNlcmlmIgpCRUdJTgogIERFRlBVU0hCVVRUT04gIiZaYW1rbmlqIiwgICAgIElEQ0FOQ0VMLDMwOCw2LDQ0LDE0CiAgUFVTSEJVVFRPTiAgICAiWiZyZXNldHVqIiwgICAgIElEQ19SRVNFVF9CVE4sMzA4LDIzLDQ0LDE0CiAgUFVTSEJVVFRPTiAgICAiJlBvbW9jIiwgICAgICBJRENfSEVMUF9CVE4sMzA4LDQwLDQ0LDE0CiAgUFVTSEJVVFRPTiAgICAiUHJ6ZW5pZZwgJncgZ/Ny6iIsICAgSURDX01PVkVVUF9CVE4sMzA4LDc0LDQ0LDE0CiAgUFVTSEJVVFRPTiAgICAiUHJ6ZW5pZZwgdyAmZPOzIiwgSURDX01PVkVETl9CVE4sMzA4LDkxLDQ0LDE0CiAgTFRFWFQgICAgICAgICAiRG8mc3TqcG5lIHByenljaXNraToiLCAtMSw0LDUsODQsMTAKICBMSVNUQk9YICAgICAgIElEQ19BVkFJTEJUTl9MQk9YLDQsMTcsMTIwLDEwMCwgTEJTX05PVElGWSB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX05PSU5URUdSQUxIRUlHSFQgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX0hTQ1JPTEwgfCBXU19UQUJTVE9QCiAgUFVTSEJVVFRPTiAgICAiRCZvZGFqIC0+IiwgICAgSURPSywgMTMxLCA0MiwgNDQsIDE0CiAgUFVTSEJVVFRPTiAgICAiPC0gJlVzdfEiLCBJRENfUkVNT1ZFX0JUTiwxMzEsNjIsNDQsMTQKICBMVEVYVCAgICAgICAgICImUHJ6eWNpc2tpIHBhc2thIG5hcnrqZHppOiIsIC0xLDE4Miw1LDc4LDEwCiAgTElTVEJPWCAgICAgICBJRENfVE9PTEJBUkJUTl9MQk9YLCAxODIsMTcsMTIwLDEwMCxMQlNfTk9USUZZIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfTk9JTlRFR1JBTEhFSUdIVCB8IExCU19ESVNBQkxFTk9TQ1JPTEwgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfSFNDUk9MTCB8IFdTX1RBQlNUT1AKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBJRFNfQ0xPU0UgICAgIlphbWtuaWoiCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElETV9UT0RBWSAgICAiRHppnDoiCiAgICBJRE1fR09UT0RBWSAgIklknyBkbyBkemmcIgp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBJRFNfU0VQQVJBVE9SICJPZHN06nAiCn0K