LyoKICogQ29weXJpZ2h0IDIwMDYgU2FtdWVsIExpZOluIEJvcmVsbAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgoKTEFOR1VBR0UgTEFOR19TV0VESVNILCBTVUJMQU5HX0RFRkFVTFQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19IVE1MRElTQUJMRUQgICAgIkhUTUwtdmlzbmluZyDkciBpbnRlIGFrdGl2ZXJhZC4iCiAgICBJRFNfSFRNTERPQ1VNRU5UICAgICJIVE1MLWRva3VtZW50IgogICAgSURTX0RPV05MT0FESU5HICAgICAiSORtdGFyLi4uIgogICAgSURTX0lOU1RBTExJTkcgICAgICAiSW5zdGFsbGVyYXIuLi4iCn0KCklEX0RXTF9ESUFMT0cgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgIDAsIDAsIDI2MCwgODUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IERTX0NFTlRFUiB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIldpbmUgR2Vja28gSW5zdGFsbGF0aW9uc3Byb2dyYW0iCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewogICAgTFRFWFQgIkRldHRhIHByb2dyYW0gZvZyc/ZrZXIgdmlzYSBlbiBIVE1MLXNpZGEuIFdpbmUgYmVo9nZlciBoYSBHZWNrbyAoTW96aWxsYXMgSFRNTC0iIFwKICAgICAgICAgICJwcm9ncmFtdmFyYSkgaW5zdGFsbGVyYWQgZvZyIGF0dCB2aXNhIHNpZGFuLiBW5GxqIEluc3RhbGxlcmEgb20gZHUgdmlsbCBhdHQgV2luZSAiIFwKICAgICAgICAgICJhdXRvbWF0aXNrdCBza2EgaORtdGEgb2NoIGluc3RhbGxlcmEgR2Vja28uIiwgSURfRFdMX1NUQVRVUywgMTAsIDEwLCAyNDAsIDMwLCBTU19MRUZUCiAgICBDT05UUk9MICJQcm9ncmVzcyIsIElEX0RXTF9QUk9HUkVTUywgUFJPR1JFU1NfQ0xBU1NBLCBXU19CT1JERVJ8UEJTX1NNT09USCwgMTAsIDQwLCAyNDAsIDEyCiAgICBQVVNIQlVUVE9OICJBdmJyeXQiLCBJRENBTkNFTCwgMTQwLCA2MCwgNTAsIDE1LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKICAgIFBVU0hCVVRUT04gIkluc3RhbGxlcmEiLCBJRF9EV0xfSU5TVEFMTCwgMjAwLCA2MCwgNTAsIDE1LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKfQo=