LyoNCiAqIEdTdHJlYW1lcg0KICogQ29weXJpZ2h0IDIwMDUgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+DQogKiBDb3B5cmlnaHQgMjAwNSBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+DQogKiBDb3B5cmlnaHQgMjAwNSBT6WJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4NCiAqIENvcHlyaWdodCAyMDA2IEpvbmkgVmFsdGFuZW4gPGpvbmkudmFsdGFuZW5AbW92aWFsLmZpPg0KICogDQogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQ0KICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwNCiAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24NCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLA0KICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlDQogKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KICoNCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluDQogKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCiAqDQogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HDQogKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSDQogKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUNCiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSAodGhlICJMR1BMIiksIGluDQogKiB3aGljaCBjYXNlIHRoZSBmb2xsb3dpbmcgcHJvdmlzaW9ucyBhcHBseSBpbnN0ZWFkIG9mIHRoZSBvbmVzDQogKiBtZW50aW9uZWQgYWJvdmU6DQogKg0KICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMNCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcg0KICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KICoNCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQogKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYw0KICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUNCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLA0KICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuDQogKi8NCg0KI2lmbmRlZiBfX0dTVF9ESVJFQ1RTT1VORFNSQ19IX18NCiNkZWZpbmUgX19HU1RfRElSRUNUU09VTkRTUkNfSF9fDQoNCiNpbmNsdWRlIDxnc3QvZ3N0Lmg+DQojaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+DQojaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvc3JjLmg+DQojaW5jbHVkZSA8d2luZG93cy5oPg0KI2luY2x1ZGUgPGRzb3VuZC5oPg0KI2luY2x1ZGUgPG1tc3lzdGVtLmg+Cg0KLyogYWRkIGhlcmUgc29tZSBoZWFkZXJzIGlmIG5lZWRlZCAqLw0KDQoNCkdfQkVHSU5fREVDTFMNCg0KLyogI2RlZmluZXMgZG9uJ3QgbGlrZSB3aGl0ZXNwYWNleSBiaXRzICovDQojZGVmaW5lIEdTVF9UWVBFX0RJUkVDVFNPVU5EX1NSQyAoZ3N0X2RpcmVjdHNvdW5kX3NyY19nZXRfdHlwZSgpKQ0KI2RlZmluZSBHU1RfRElSRUNUU09VTkRfU1JDKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLEdTVF9UWVBFX0RJUkVDVFNPVU5EX1NSQyxHc3REaXJlY3RTb3VuZFNyYykpDQojZGVmaW5lIEdTVF9ESVJFQ1RTT1VORF9TUkNfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCgoa2xhc3MpLEdTVF9UWVBFX0RJUkVDVFNPVU5EX1NSQyxHc3REaXJlY3RTb3VuZFNyY0NsYXNzKSkNCiNkZWZpbmUgR1NUX0lTX0RJUkVDVFNPVU5EX1NSQyhvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSxHU1RfVFlQRV9ESVJFQ1RTT1VORF9TUkMpKQ0KI2RlZmluZSBHU1RfSVNfRElSRUNUU09VTkRfU1JDX0NMQVNTKGtsYXNzKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSxHU1RfVFlQRV9ESVJFQ1RTT1VORF9TUkMpKQ0KDQp0eXBlZGVmIHN0cnVjdCBfR3N0RGlyZWN0U291bmRTcmMgICAgICBHc3REaXJlY3RTb3VuZFNyYzsNCnR5cGVkZWYgc3RydWN0IF9Hc3REaXJlY3RTb3VuZFNyY0NsYXNzIEdzdERpcmVjdFNvdW5kU3JjQ2xhc3M7DQoNCiNkZWZpbmUgR1NUX0RTT1VORF9MT0NLKG9iaikJKGdfbXV0ZXhfbG9jayAoJm9iai0+ZHNvdW5kX2xvY2spKQ0KI2RlZmluZSBHU1RfRFNPVU5EX1VOTE9DSyhvYmopCShnX211dGV4X3VubG9jayAoJm9iai0+ZHNvdW5kX2xvY2spKQ0KDQpzdHJ1Y3QgX0dzdERpcmVjdFNvdW5kU3JjDQp7DQoNCiAgR3N0QXVkaW9TcmMgc3JjOw0KDQogIEhJTlNUQU5DRSBEU291bmRETEw7IC8qIERMTCBpbnN0YW5jZSAqLw0KICBMUERJUkVDVFNPVU5EQ0FQVFVSRSBwRFNDOyAvKiBEaXJlY3RTb3VuZENhcHR1cmUqLw0KICBMUERJUkVDVFNPVU5EQ0FQVFVSRUJVRkZFUiBwRFNCU2Vjb25kYXJ5OyAgLypTZWNvbmRhdHkgY2FwdHVyZWJ1ZmZlciovDQogIERXT1JEIGN1cnJlbnRfY2lyY3VsYXJfb2Zmc2V0Ow0KDQogIEhBTkRMRSByZ2hFdmVudDsNCiAgRFdPUkQgbm90aWZ5c2l6ZTsNCg0KICBndWludCBidWZmZXJfc2l6ZTsNCiAgZ3VpbnQgbGF0ZW5jeV9zaXplOw0KICBndWludCBieXRlc19wZXJfc2FtcGxlOw0KDQogIGd1aW50IGJ1ZmZlcl90aW1lOw0KICBndWludCBsYXRlbmN5X3RpbWU7DQoNCiAgSE1JWEVSIG1peGVyOwogIERXT1JEIG1peGVybGluZV9jY2hhbm5lbHM7CiAgZ2ludCBjb250cm9sX2lkX3ZvbHVtZTsKICBnaW50IGNvbnRyb2xfaWRfbXV0ZTsKICBnbG9uZyBkd192b2xfbWF4OwogIGdsb25nIGR3X3ZvbF9taW47CgogIGdsb25nIHZvbHVtZTsKICBnYm9vbGVhbiBtdXRlOwoNCiAgR1VJRCAqZGV2aWNlX2d1aWQ7DQogIGNoYXIgKmRldmljZV9uYW1lOw0KDQogIEdNdXRleCBkc291bmRfbG9jazsNCg0KfTsNCg0Kc3RydWN0IF9Hc3REaXJlY3RTb3VuZFNyY0NsYXNzIA0Kew0KICBHc3RBdWRpb1NyY0NsYXNzIHBhcmVudF9jbGFzczsNCn07DQoNCkdUeXBlIGdzdF9kaXJlY3Rzb3VuZF9zcmNfZ2V0X3R5cGUgKHZvaWQpOw0KDQpHX0VORF9ERUNMUw0KDQojZW5kaWYgLyogX19HU1RfRElSRUNUU09VTkRTUkNfSF9fICovDQo=