LyoKICogRW5nbGlzaCByZXNvdXJjZXMgZm9yIHNobHdhcGkKICoKICogQ29weXJpZ2h0IDIwMDQgSm9uIEdyaWZmaXRocwogKiBDb3B5cmlnaHQgMjAwNiBNaWtvbGFqIFphbGV3c2tpCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfUE9MSVNILCBTVUJMQU5HX0RFRkFVTFQKCklERF9FUlJfRElBTE9HIERJQUxPRyBNT1ZFQUJMRSBESVNDQVJEQUJMRSAwLCAwLCAyMjAsIDYwClNUWUxFIERTX01PREFMRlJBTUUgfCBEU19DRU5URVIgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIkKzuWQhIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKIExURVhUICIiLCBJRFNfRVJSX1VTRVJfTVNHMiwgMTUsIDUsIDI4LCAyMAogTFRFWFQgIiIsIElEU19FUlJfVVNFUl9NU0csIDE1LCA1LCAyMTAsIDgKIENIRUNLQk9YICJOaWUgcG9rYXp1aiB3JmnqY2VqIHRlZ28ga29tdW5pa2F0dSIsIElEQ19FUlJfRE9OVF9TSE9XLCA1LCAyMCwgMjEwLCAxMCwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCiBQVVNIQlVUVE9OIEwiJk9LIiBJRE9LLCAxMDUsIDQwLCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAogUFVTSEJVVFRPTiBMIiZBbnVsdWoiIElEQ0FOQ0VMLCAxNjAsIDQwLCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAogUFVTSEJVVFRPTiBMIiZUYWsiIElEWUVTLCAxMDUsIDQwLCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAogUFVTSEJVVFRPTiBMIiZOaWUiIElETk8sIDE2MCwgNDAsIDUwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19CWVRFU19GT1JNQVQgICAgIiVsZCBiYWp083ciCiAgICBJRFNfVElNRV9JTlRFUlZBTF9IT1VSUyAgICAiIGdvZHouIgogICAgSURTX1RJTUVfSU5URVJWQUxfTUlOVVRFUyAgIiBtaW4uIgogICAgSURTX1RJTUVfSU5URVJWQUxfU0VDT05EUyAgIiBzIgp9Cg==