LyoKICogU3RhcnQKICogU3BhbmlzaCBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDAzIEpvc+kgTWFudWVsIEZlcnJlciBPcnRpegogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpMQU5HVUFHRSBMQU5HX1NQQU5JU0gsIFNVQkxBTkdfREVGQVVMVAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgTEFOR1VBR0UgTEFOR19TUEFOSVNILCBTVUJMQU5HX0RFRkFVTFQKewpTVFJJTkdfVVNBR0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5pY2lhIHVuIHByb2dyYW1hLCBvIGFicmUgdW4gZG9jdW1lbnRvIGNvbiBlbCBwcm9ncmFtYSBxdWUgc2Ugc3VlbGUgdXRpbGl6YXIgcGFyYSBhcmNoaXZvcyBjb24gZXNhIGV4dGVuc2nzbi4gXG5cClVzbzogXG5cCnN0YXJ0IFtvcGNpb25lc10gZmljaGVyb19wcm9ncmFtYSBbLi4uXSBcblwKc3RhcnQgW29wY2lvbmVzXSBmaWNoZXJvX2RvY3VtZW50byBcblwKIFxuXApPcGNpb25lczogXG5cCi9NW2luaW1pemVkXSBJbmljaWEgZWwgcHJvZ3JhbWEgbWluaW1pemFkby4gXG5cCi9NQVhbaW1pemVkXSBJbmljaWEgZWwgcHJvZ3JhbWEgbWF4aW1pemFkby4gXG5cCi9SW2VzdG9yZWRdICBJbmljaWEgZWwgcHJvZ3JhbWEgbm9ybWFsbWVudGUgKG5pIG1pbmltaXphZG8gbmkgbWF4aW1pemFkbykuIFxuXAovV1thaXRdICAgICAgRXNwZXJhIHF1ZSB0ZXJtaW5lIGVsIHByb2dyYW1hIGluaWNpYWRvIHkgZGVzcHXpcyBzYWxlIGNvbiBzdSBj82RpZ28gZGUgc2FsaWRhLiBcblwKL0wgICAgICAgICAgIE11ZXN0cmEgbGEgbGljZW5jaWEgcGFyYSBlbCB1c3VhcmlvIGZpbmFsLiBcblwKIFxuXApzdGFydC5leGUgdmVyc2nzbiAwLjIgQ29weXJpZ2h0IChDKSAyMDAzLCBEYW4gS2VnZWwgXG5cClN0YXJ0IHZpZW5lIEFCU09MVVRBTUVOVEUgU0lOIEdBUkFOVM1BOyBwYXJhIGRldGFsbGVzIGVqZWN0+nRlc2UgY29uIGxhIG9wY2nzbiAvTC4gXG5cCkVzdG8gZXMgc29mdHdhcmUgbGlicmUsIHkgc2UgbGUgcGVybWl0ZSByZWRpc3RyaWJ1aXJsbyBcblwKYmFqbyBjaWVydGFzIGNvbmRpY2lvbmVzOyBlamVjdXRlICdzdGFydCAvTCcgcGFyYSBvYnRlbmVyIGRldGFsbGVzLiBcblwKIgoKU1RSSU5HX0xJQ0VOU0UsICJzdGFydC5leGUgdmVyc2nzbiAwLjIgQ29weXJpZ2h0IChDKSAyMDAzLCBEYW4gS2VnZWwgXG5cClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgXG5cCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgXG5cCmFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgXG5cCm9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBcblwKIFxuXApUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgXG5cCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIFxuXApNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIFxuXApHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIFxuXAogXG5cCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgXG5cCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIFxuXApGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gXG5cCiBcblwKTWlyZSBlbCBhcmNoaXZvIENPUFlJTkcuTElCIHBhcmEgaW5mb3JtYWNp824gc29icmUgbGEgbGljZW5jaWEuIFxuXAoiCgpTVFJJTkdfRVhFQ0ZBSUwgIkxhIGFwbGljYWNp824gbm8gc2UgcHVkbyBlamVjdXRhciwgbyBubyBoYXkgbmluZ3VuYSBhcGxpY2FjafNuIGFzb2NpYWRhIGNvbiBlbCBhcmNoaXZvIGVzcGVjaWZpY2Fkby5cblNoZWxsRXhlY3V0ZUV4IGZhbGxpZG8iCn0K