LyoKICogQ29weXJpZ2h0IDIwMDUgQWxleGFuZGVyIE4uIFP4cm5lcyA8YWxleEB0aGVoYW5kb2ZhZ29ueS5jb20+CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCgpMQU5HVUFHRSBMQU5HX05PUldFR0lBTiwgU1VCTEFOR19OT1JXRUdJQU5fQk9LTUFMCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBJRFNfSFRNTERJU0FCTEVEICAgICJIVE1MLXRlZ25pbmcgZXIgZm9yIPh5ZWJsaWtrZXQgZGVha3RpdmVydC4iCiAgICBJRFNfSFRNTERPQ1VNRU5UICAgICJIVE1MLWRva3VtZW50IgogICAgSURTX0RPV05MT0FESU5HICAgICAiTGFzdGVyIG5lZCAuIC4gLiIKICAgIElEU19JTlNUQUxMSU5HICAgICAgIkluc3RhbGxlcmVyIC4gLiAuIgogICAgfQoKICAgIElEX0RXTF9ESUFMT0cgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgIDAsIDAsIDI2MCwgODUKICAgIFNUWUxFIERTX01PREFMRlJBTUUgfCBEU19DRU5URVIgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogICAgQ0FQVElPTiAiSW5zdGFsbGVyZSBXaW5lIEdlY2tvIgogICAgRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgogICAgewogICAgTFRFWFQgIkRldHRlIHByb2dyYW1tZXIgcHL4dmVyIOUgdmlzZSBlbiBIVE1MLXNpZGUuIFdpbmUgdHJlbmdlciBHZWNrbyAiIFwKICAgICIoTW96aWxsYXMgSFRNTC1tb3RvcikgZm9yIOUgdmlzZSBkZW5uZSBzaWRlbi4gVmVsZyCrSW5zdGFsbGVyuyBodmlzICIgXAogICAgImR1IHZpbCBhdCBXaW5lIHNrYWwgbGFzdGUgbmVkIG9nIGluc3RhbGxlcmUgR2Vja28gYXV0b21hdGlzay4iLCBJRF9EV0xfU1RBVFVTLCAxMCwgMTAsIDI0MCwgMzAsIFNTX0xFRlQKICAgIENPTlRST0wgIlByb2dyZXNzIiwgSURfRFdMX1BST0dSRVNTLCBQUk9HUkVTU19DTEFTU0EsIFdTX0JPUkRFUnxQQlNfU01PT1RILCAxMCwgNDAsIDI0MCwgMTIKICAgIFBVU0hCVVRUT04gIkF2YnJ5dCIsIElEQ0FOQ0VMLCAxNDAsIDYwLCA1MCwgMTUsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAogICAgUFVTSEJVVFRPTiAiSW5zdGFsbGVyIiwgSURfRFdMX0lOU1RBTEwsIDIwMCwgNjAsIDUwLCAxNSwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCn0K