LyoKICogIFUtYm9vdCAtIGkzODYgU3RhcnR1cCBDb2RlCiAqCiAqICBDb3B5cmlnaHQgKGMpIDIwMDIJT21pY3JvbiBDZXRpIEFCLCBEYW5pZWwgRW5nc3Ry9m0gPGRlbmFpZWxAb21pY3Jvbi5zZT4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgoKI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8dmVyc2lvbi5oPgoKCi5zZWN0aW9uIC50ZXh0Ci5jb2RlMzIKLmdsb2JsIF9zdGFydAoudHlwZSBfc3RhcnQsIEBmdW5jdGlvbgouZ2xvYmwgX2kzODZib290X3N0YXJ0Cl9pMzg2Ym9vdF9zdGFydDoKCS8qCgkgKiBUaGlzIGlzIHRoZSBmYWlsIHNhZmUgMzItYml0IGJvb3RzdHJhcCBlbnRyeSBwb2ludC4gVGhlCgkgKiBmb2xsb3dpbmcgY29kZSBpcyBub3QgZXhlY3V0ZWQgZnJvbSBhIGNvbGQtcmVzZXQgKGFjdHVhbGx5LCBhCgkgKiBsb3Qgb2YgaXQgaXMsIGJ1dCBmcm9tIHJlYWwtbW9kZSBhZnRlciBjb2xkIHJlc2V0LiBJdCBpcwoJICogcmVwZWF0ZWQgaGVyZSB0byBwdXQgdGhlIGJvYXJkIGludG8gYSBzdGF0ZSBhcyBjbG9zZSB0byBjb2xkCgkgKiByZXNldCBhcyBuZWNlc3NhcnkpCgkgKi8KCWNsaQoJY2xkCgoJLyogVHVybiBvZiBjYWNoZSAodGhpcyBtaWdodCByZXF1aXJlIGEgNDg2LWNsYXNzIENQVSkgKi8KCW1vdmwJJWNyMCwgJWVheAoJb3JsCSQweDYwMDAwMDAwLCAlZWF4Cgltb3ZsCSVlYXgsICVjcjAKCXdiaW52ZAoKCS8qIFRlbGwgMzItYml0IGNvZGUgaXQgaXMgYmVpbmcgZW50ZXJlZCBmcm9tIGFuIGluLVJBTSBjb3B5ICovCgltb3Z3CSQweDAwMDAsICVieApfc3RhcnQ6CgkvKiBUaGlzIGlzIHRoZSAzMi1iaXQgY29sZC1yZXNldCBlbnRyeSBwb2ludCAqLwoKCW1vdmwJJDB4MTgsICVlYXgJLyogTG9hZCBvdXIgc2VnZW1lbnQgcmVnaXN0ZXMsIHRoZQoJCQkJICogZ2R0IGhhdmUgYWxyZWFkeSBiZWVuIGxvYWRlZCBieSBzdGFydDE2LlMgKi8KCW1vdncJJWF4LCAlZnMKCW1vdncJJWF4LCAlZHMKCW1vdncJJWF4LCAlZ3MKCW1vdncJJWF4LCAlZXMKCW1vdncJJWF4LCAlc3MKCgkvKiBDbGVhciB0aGUgaW50ZXJ1cHQgdmVjdG9ycyAqLwoJbGlkdAlibGFua19pZHRfcHRyCgoJLyoKCSAqIFNraXAgbG93LWxldmVsIGJvYXJkIGFuZCBtZW1vcnkgaW5pdGlhbGl6YXRpb24gaWYgbm90IHN0YXJ0aW5nCgkgKiBmcm9tIGNvbGQtcmVzZXQuIFRoaXMgYWxsb3dzIHVzIHRvIGRvIGEgZmFpbCBzYWZlIGJvb3Qtc3RyYXAKCSAqIGludG8gYSBuZXcgYnVpbGQgb2YgVS1Cb290IGZyb20gYSBrbm93bi1nb29kIGJvb3QgZmxhc2gKCSAqLwoJbW92dwkkMHgwMDAxLCAlYXgKCWNtcHcJJWF4LCAlYngKCWpuZQltZW1faW5pdF9yZXQKCgkvKiBXZSBjYWxsIGEgZmV3IGZ1bmN0aW9ucyBpbiB0aGUgYm9hcmQgc3VwcG9ydCBwYWNrYWdlCgkgKiBzaW5jZSB3ZSBoYXZlIG5vIHN0YWNrIHlldCB3ZSdsbCBoYXZlIHRvIHVzZSAlZWJwCgkgKiB0byBzdG9yZSB0aGUgcmV0dXJuIGFkZHJlc3MgKi8KCgkvKiBFYXJseSBwbGF0Zm9ybSBpbml0IChzZXR1cCBncGlvLCBldGMgKSAqLwoJbW92CSRlYXJseV9ib2FyZF9pbml0X3JldCwgJWVicAoJam1wCWVhcmx5X2JvYXJkX2luaXQKZWFybHlfYm9hcmRfaW5pdF9yZXQ6CgoJLyogc2l6ZSBtZW1vcnkgKi8KCW1vdgkkbWVtX2luaXRfcmV0LCAlZWJwCglqbXAJbWVtX2luaXQKbWVtX2luaXRfcmV0OgoKCS8qIGZldGNoIG1lbW9yeSBzaXplIChpbnRvICVlYXgpICovCgltb3YJJGdldF9tZW1fc2l6ZV9yZXQsICVlYnAKCWptcAlnZXRfbWVtX3NpemUKZ2V0X21lbV9zaXplX3JldDoKCgkvKiBDaGVjayB3ZSBoYXZlIGVub3VnaCBtZW1vcnkgZm9yIHN0YWNrICovCgltb3ZsCSRDT05GSUdfU1lTX1NUQUNLX1NJWkUsICVlY3gKCWNtcGwJJWVjeCwgJWVheAoJamIJZGllCm1lbV9vazoKCS8qIFNldCBzdGFjayBwb2ludGVyIHRvIHVwcGVyIG1lbW9yeSBsaW1pdCovCgltb3ZsCSVlYXgsICVlc3AKCgkvKiBUZXN0IHRoZSBzdGFjayAqLwoJcHVzaGwJJDAKCXBvcGwJJWVheAoJY21wbAkkMCwgJWVheAoJam5lCW5vX3N0YWNrCglwdXNoCSQweDU1YWE1NWFhCglwb3BsCSVlYngKCWNtcGwJJDB4NTVhYTU1YWEsICVlYngKCWpuZQlkaWUKCgl3YmludmQKCgkvKiBTZXQgdGhlIHVwcGVyIG1lbW9yeSBsaW1pdCBwYXJhbWV0ZXIgKi8KCW1vdmwJJWVzcCwgJWVheAoJc3VibAkkQ09ORklHX1NZU19TVEFDS19TSVpFLCAlZWF4CgoJY2FsbAlib2FyZF9pbml0X2YJLyogRW50ZXIsIFUtYm9vdCEgKi8KCgkvKiBpbmRpY2F0ZSAobGFjayBvZikgcHJvZ3Jlc3MgKi8KCW1vdncJJDB4ODUsICVheApkaWU6CWhsdAoJam1wCWRpZQoJaGx0CgpibGFua19pZHRfcHRyOgoJLndvcmQJMAkJLyogbGltaXQgKi8KCS5sb25nCTAJCS8qIGJhc2UgKi8K