LyoKICogU3RhcnQgKER1dGNoIHJlc291cmNlcykKICoKICogQ29weXJpZ2h0IDIwMDMgSGFucyBMZWlkZWtrZXIKICogQ29weXJpZ2h0IDIwMDggRnJhbnMgS29vbAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAicmVzb3VyY2VzLmgiCgpMQU5HVUFHRSBMQU5HX0RVVENILCBTVUJMQU5HX05FVVRSQUwKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFIExBTkdVQUdFIExBTkdfRFVUQ0gsIFNVQkxBTkdfTkVVVFJBTAp7ClNUUklOR19VU0FHRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGFydCBlZW4gcHJvZ3JhbW1hLCBvZiBvcGVuIGVlbiBkb2N1bWVudCBtZXQgaGV0IHByb2dyYW1tYSBkYXQgbm9ybWFhbCB2b29yIGJlc3RhbmRlbiBtZXQgZGllIGV4dGVuc2llIGdlYnJ1aWt0IHdvcmR0LlxuXApHZWJydWlrOlxuXApzdGFydCBbb3B0aWVzXSBwcm9ncmFtbWFfbmFhbSBbLi4uXVxuXApzdGFydCBbb3B0aWVzXSBkb2N1bWVudF9uYWFtXG5cClxuXApPcHRpZXM6XG5cCi9NW2luaW1pemVkXSBTdGFydCBoZXQgcHJvZ3JhbW1hIGdlbWluaW1hbGlzZWVyZC5cblwKL01BWFtpbWl6ZWRdIFN0YXJ0IGhldCBwcm9ncmFtbWEgZ2VtYXhpbWFsaXNlZXJkLlxuXAovUltlc3RvcmVkXSAgU3RhcnQgaGV0IHByb2dyYW1tYSBub3JtYWFsIChub2NoIGdlbWluaW1hbGlzZWVyZCBub2NoIGdlbWF4aW1hbGlzZWVyZCkuXG5cCi9XW2FpdF0gICAgICBXYWNodCB0b3RkYXQgaGV0IGdlc3RhcnRlIHByb2dyYW1tYSBpcyBiZetpbmRpZ2QsIGVpbmRpZyBkYW4gbWV0IGRlIGV4aXQgY29kZSB2YW4gZGF0IHByb2dyYW1tYS5cblwKL1VuaXggICAgICAgIEdlYnJ1aWsgZWVuIFVuaXggYmVzdGFuZHNuYWFtIGVuIHN0YXJ0IGhldCBiZXN0YW5kIGFscyBkZSBXaW5kb3dzIHZlcmtlbm5lci5cblwKL1Byb2dJRE9wZW4gIE9wZW4gZWVuIGRvY3VtZW50IG1ldCBiZWh1bHAgdmFuIGhldCB2b2xnZW5kZSBwcm9nSUQuXG5cCi9MICAgICAgICAgICBMYWF0IGRlIGdlYnJ1aWtlcnNsaWNlbnRpZSB6aWVuLlxuXApcblwKc3RhcnQuZXhlIHZlcnNpb24gMC4yIENvcHlyaWdodCAoQykgMjAwMywgRGFuIEtlZ2VsXG5cClN0YXJ0IHdvcmR0IHUgQUJTT0xVVVQgWk9OREVSIEdBUkFOVElFIGFhbmdlYm9kZW47IGRyYWFpIGRpdCBwcm9ncmFtbWEgbWV0IGRlIC9MIG9wdGllIHZvb3IgZGV0YWlscy5cblwKRGl0IGlzIHZyaWplIHNvZnR3YXJlLCBlbiB1IHdvcmR0IHVpdGdlbm9kaWdkIG9tIGhldCB2ZXJkZXIgdGUgdmVyc3ByZWlkZW5cblwKb25kZXIgYmVwYWFsZGUgdm9vcndhYXJkZW47IGRyYWFpICdzdGFydCAvTCcgdm9vciBkZXRhaWxzLlxuXAoiCgpTVFJJTkdfTElDRU5TRSwgInN0YXJ0LmV4ZSB2ZXJzaWUgMC4yIENvcHlyaWdodCAoQykgMjAwMywgRGFuIEtlZ2VsXG5cClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3JcblwKbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBQdWJsaWMgTGljZW5zZVxuXAphcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xXG5cCm9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuXApcblwKVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG5cCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG5cCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcblwKR05VIExlc3NlciBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuXApcblwKWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBQdWJsaWMgTGljZW5zZVxuXAphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuXApGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLlxuXApcblwKQmVraWprIGhldCBDT1BZSU5HLkxJQiBiZXN0YW5kIHZvb3IgaW5mb3JtYXRpZSBvdmVyIGRlIGxpY2VudGllLlxuXAoiCgpTVFJJTkdfRVhFQ0ZBSUwgIlByb2dyYW1tYSBrYW4gbmlldCB3b3JkZW4gZ2VzdGFydCwgb2YgZXIgaXMgZ2VlbiBwcm9ncmFtbWEgdmVyYm9uZGVuIG1ldCBoZXQgb3BnZWdldmVuIGJlc3RhbmQuXG5TaGVsbEV4ZWN1dGVFeCBpcyBtaXNsdWt0IgoKU1RSSU5HX1VOSVhGQUlMICJLb24gZGUgb3BnZWdldmVuIFVuaXggYmVzdGFuZHNuYWFtIG5pZXQgb216ZXR0ZW4gbmFhciBlZW4gRE9TIGJlc3RhbmRzbmFhbS4iCn0K