LyoKICogU3RhcnQKICogU3BhbmlzaCBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDAzLDIwMDggSm9z6SBNYW51ZWwgRmVycmVyIE9ydGl6CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfU1BBTklTSCwgU1VCTEFOR19ORVVUUkFMCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7ClNUUklOR19VU0FHRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmljaWEgdW4gcHJvZ3JhbWEsIG8gYWJyZSB1biBkb2N1bWVudG8gY29uIGVsIHByb2dyYW1hIHF1ZSBzZSBzdWVsZSB1dGlsaXphciBwYXJhIGFyY2hpdm9zIGNvbiBlc2EgZXh0ZW5zafNuLlxuXApVc286XG5cCnN0YXJ0IFtvcGNpb25lc10gZmljaGVyb19wcm9ncmFtYSBbLi4uXVxuXApzdGFydCBbb3BjaW9uZXNdIGZpY2hlcm9fZG9jdW1lbnRvXG5cClxuXApPcGNpb25lczpcblwKL01baW5pbWl6ZWRdIEluaWNpYSBlbCBwcm9ncmFtYSBtaW5pbWl6YWRvLlxuXAovTUFYW2ltaXplZF0gSW5pY2lhIGVsIHByb2dyYW1hIG1heGltaXphZG8uXG5cCi9SW2VzdG9yZWRdICBJbmljaWEgZWwgcHJvZ3JhbWEgbm9ybWFsbWVudGUgKG5pIG1pbmltaXphZG8gbmkgbWF4aW1pemFkbykuXG5cCi9XW2FpdF0gICAgICBFc3BlcmEgcXVlIHRlcm1pbmUgZWwgcHJvZ3JhbWEgaW5pY2lhZG8geSBkZXNwdelzIHNhbGUgY29uIHN1IGPzZGlnbyBkZSBzYWxpZGEuXG5cCi9Vbml4ICAgICAgICBVc2EgdW4gbm9tYnJlIGRlIGFyY2hpdm8gZGUgVW5peCBlIGluaWNpYSBlbCBhcmNoaXZvIGNvbW8gZW4gZWwgZXhwbG9yYWRvciBkZSB3aW5kb3dzLlxuXAovTCAgICAgICAgICAgTXVlc3RyYSBsYSBsaWNlbmNpYSBwYXJhIGVsIHVzdWFyaW8gZmluYWwuXG5cClxuXApzdGFydC5leGUgdmVyc2nzbiAwLjIgQ29weXJpZ2h0IChDKSAyMDAzLCBEYW4gS2VnZWxcblwKU3RhcnQgdmllbmUgQUJTT0xVVEFNRU5URSBTSU4gR0FSQU5UzUE7IHBhcmEgZGV0YWxsZXMgZWplY3T6dGVzZSBjb24gbGEgb3BjafNuIC9MLlxuXApFc3RvIGVzIHNvZnR3YXJlIGxpYnJlLCB5IHNlIGxlIHBlcm1pdGUgcmVkaXN0cmlidWlybG9cblwKYmFqbyBjaWVydGFzIGNvbmRpY2lvbmVzOyBlamVjdXRlICdzdGFydCAvTCcgcGFyYSBvYnRlbmVyIGRldGFsbGVzLlxuXAoiCgpTVFJJTkdfTElDRU5TRSwgInN0YXJ0LmV4ZSB2ZXJzafNuIDAuMiBDb3B5cmlnaHQgKEMpIDIwMDMsIERhbiBLZWdlbFxuXApUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG5cCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2VcblwKYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMVxuXApvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cblwKXG5cClRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuXApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuXApNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG5cCkdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cblwKXG5cCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2VcblwKYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcblwKRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS5cblwKXG5cCk1pcmUgZWwgYXJjaGl2byBDT1BZSU5HLkxJQiBwYXJhIGluZm9ybWFjafNuIHNvYnJlIGxhIGxpY2VuY2lhLlxuXAoiCgpTVFJJTkdfRVhFQ0ZBSUwgIkxhIGFwbGljYWNp824gbm8gc2UgcHVkbyBlamVjdXRhciwgbyBubyBoYXkgbmluZ3VuYSBhcGxpY2FjafNuIGFzb2NpYWRhIGNvbiBlbCBhcmNoaXZvIGVzcGVjaWZpY2Fkby5cblNoZWxsRXhlY3V0ZUV4IGZhbGxpZG8iCgpTVFJJTkdfVU5JWEZBSUwgIkNvdWxkIG5vdCB0cmFuc2xhdGUgdGhlIHNwZWNpZmllZCBVbml4IGZpbGVuYW1lIHRvIGEgRE9TIGZpbGVuYW1lLiIKfQo=