ZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2wuaCBiL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjY5OTc2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2luY2x1ZGUvRUdML2VnbC5oCkBAIC0wLDAgKzEsMzMwIEBACisvKiAtKi0gbW9kZTogYzsgdGFiLXdpZHRoOiA4OyAtKi0gKi8KKy8qIHZpOiBzZXQgc3c9NCB0cz04OiAqLworLyogUmVmZXJlbmNlIHZlcnNpb24gb2YgZWdsLmggZm9yIEVHTCAxLjQuCisgKiAkUmV2aXNpb246IDcyNDQgJCBvbiAkRGF0ZTogMjAwOS0wMS0yMCAxNzowNjo1OSAtMDgwMCAoVHVlLCAyMCBKYW4gMjAwOSkgJAorICovCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKgorKiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyoqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyoqICJNYXRlcmlhbHMiKSwgdG8gZGVhbCBpbiB0aGUgTWF0ZXJpYWxzIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworKiogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorKiogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBNYXRlcmlhbHMsIGFuZCB0bworKiogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgTWF0ZXJpYWxzIGFyZSBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyoqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyoqCisqKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgTWF0ZXJpYWxzLgorKioKKyoqIFRIRSBNQVRFUklBTFMgQVJFIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyoqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisqKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorKiogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyoqIE1BVEVSSUFMUyBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBNQVRFUklBTFMuCisqLworCisjaWZuZGVmIF9fZWdsX2hfCisjZGVmaW5lIF9fZWdsX2hfCisKKy8qIEFsbCBwbGF0Zm9ybS1kZXBlbmRlbnQgdHlwZXMgYW5kIG1hY3JvIGJvaWxlcnBsYXRlIChzdWNoIGFzIEVHTEFQSQorICogYW5kIEVHTEFQSUVOVFJZKSBzaG91bGQgZ28gaW4gZWdscGxhdGZvcm0uaC4KKyAqLworI2luY2x1ZGUgPEVHTC9lZ2xwbGF0Zm9ybS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEVHTCBUeXBlcyAqLworLyogRUdMaW50IGlzIGRlZmluZWQgaW4gZWdscGxhdGZvcm0uaCAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgRUdMQm9vbGVhbjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEVHTGVudW07Cit0eXBlZGVmIHZvaWQgKkVHTENvbmZpZzsKK3R5cGVkZWYgdm9pZCAqRUdMQ29udGV4dDsKK3R5cGVkZWYgdm9pZCAqRUdMRGlzcGxheTsKK3R5cGVkZWYgdm9pZCAqRUdMU3VyZmFjZTsKK3R5cGVkZWYgdm9pZCAqRUdMQ2xpZW50QnVmZmVyOworCisvKiBFR0wgVmVyc2lvbmluZyAqLworI2RlZmluZSBFR0xfVkVSU0lPTl8xXzAJCQkxCisjZGVmaW5lIEVHTF9WRVJTSU9OXzFfMQkJCTEKKyNkZWZpbmUgRUdMX1ZFUlNJT05fMV8yCQkJMQorI2RlZmluZSBFR0xfVkVSU0lPTl8xXzMJCQkxCisjZGVmaW5lIEVHTF9WRVJTSU9OXzFfNAkJCTEKKworLyogRUdMIEVudW1lcmFudHMuIEJpdG1hc2tzIGFuZCBvdGhlciBleGNlcHRpb25hbCBjYXNlcyBhc2lkZSwgbW9zdAorICogZW51bXMgYXJlIGFzc2lnbmVkIHVuaXF1ZSB2YWx1ZXMgc3RhcnRpbmcgYXQgMHgzMDAwLgorICovCisKKy8qIEVHTCBhbGlhc2VzICovCisjZGVmaW5lIEVHTF9GQUxTRQkJCTAKKyNkZWZpbmUgRUdMX1RSVUUJCQkxCisKKy8qIE91dC1vZi1iYW5kIGhhbmRsZSB2YWx1ZXMgKi8KKyNkZWZpbmUgRUdMX0RFRkFVTFRfRElTUExBWQkJKChFR0xOYXRpdmVEaXNwbGF5VHlwZSkwKQorI2RlZmluZSBFR0xfTk9fQ09OVEVYVAkJCSgoRUdMQ29udGV4dCkwKQorI2RlZmluZSBFR0xfTk9fRElTUExBWQkJCSgoRUdMRGlzcGxheSkwKQorI2RlZmluZSBFR0xfTk9fU1VSRkFDRQkJCSgoRUdMU3VyZmFjZSkwKQorCisvKiBPdXQtb2YtYmFuZCBhdHRyaWJ1dGUgdmFsdWUgKi8KKyNkZWZpbmUgRUdMX0RPTlRfQ0FSRQkJCSgoRUdMaW50KS0xKQorCisvKiBFcnJvcnMgLyBHZXRFcnJvciByZXR1cm4gdmFsdWVzICovCisjZGVmaW5lIEVHTF9TVUNDRVNTCQkJMHgzMDAwCisjZGVmaW5lIEVHTF9OT1RfSU5JVElBTElaRUQJCTB4MzAwMQorI2RlZmluZSBFR0xfQkFEX0FDQ0VTUwkJCTB4MzAwMgorI2RlZmluZSBFR0xfQkFEX0FMTE9DCQkJMHgzMDAzCisjZGVmaW5lIEVHTF9CQURfQVRUUklCVVRFCQkweDMwMDQKKyNkZWZpbmUgRUdMX0JBRF9DT05GSUcJCQkweDMwMDUKKyNkZWZpbmUgRUdMX0JBRF9DT05URVhUCQkJMHgzMDA2CisjZGVmaW5lIEVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFCQkweDMwMDcKKyNkZWZpbmUgRUdMX0JBRF9ESVNQTEFZCQkJMHgzMDA4CisjZGVmaW5lIEVHTF9CQURfTUFUQ0gJCQkweDMwMDkKKyNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfUElYTUFQCQkweDMwMEEKKyNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfV0lORE9XCQkweDMwMEIKKyNkZWZpbmUgRUdMX0JBRF9QQVJBTUVURVIJCTB4MzAwQworI2RlZmluZSBFR0xfQkFEX1NVUkZBQ0UJCQkweDMwMEQKKyNkZWZpbmUgRUdMX0NPTlRFWFRfTE9TVAkJMHgzMDBFCS8qIEVHTCAxLjEgLSBJTUdfcG93ZXJfbWFuYWdlbWVudCAqLworCisvKiBSZXNlcnZlZCAweDMwMEYtMHgzMDFGIGZvciBhZGRpdGlvbmFsIGVycm9ycyAqLworCisvKiBDb25maWcgYXR0cmlidXRlcyAqLworI2RlZmluZSBFR0xfQlVGRkVSX1NJWkUJCQkweDMwMjAKKyNkZWZpbmUgRUdMX0FMUEhBX1NJWkUJCQkweDMwMjEKKyNkZWZpbmUgRUdMX0JMVUVfU0laRQkJCTB4MzAyMgorI2RlZmluZSBFR0xfR1JFRU5fU0laRQkJCTB4MzAyMworI2RlZmluZSBFR0xfUkVEX1NJWkUJCQkweDMwMjQKKyNkZWZpbmUgRUdMX0RFUFRIX1NJWkUJCQkweDMwMjUKKyNkZWZpbmUgRUdMX1NURU5DSUxfU0laRQkJMHgzMDI2CisjZGVmaW5lIEVHTF9DT05GSUdfQ0FWRUFUCQkweDMwMjcKKyNkZWZpbmUgRUdMX0NPTkZJR19JRAkJCTB4MzAyOAorI2RlZmluZSBFR0xfTEVWRUwJCQkweDMwMjkKKyNkZWZpbmUgRUdMX01BWF9QQlVGRkVSX0hFSUdIVAkJMHgzMDJBCisjZGVmaW5lIEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMJCTB4MzAyQgorI2RlZmluZSBFR0xfTUFYX1BCVUZGRVJfV0lEVEgJCTB4MzAyQworI2RlZmluZSBFR0xfTkFUSVZFX1JFTkRFUkFCTEUJCTB4MzAyRAorI2RlZmluZSBFR0xfTkFUSVZFX1ZJU1VBTF9JRAkJMHgzMDJFCisjZGVmaW5lIEVHTF9OQVRJVkVfVklTVUFMX1RZUEUJCTB4MzAyRgorI2RlZmluZSBFR0xfUFJFU0VSVkVEX1JFU09VUkNFUwkJMHgzMDMwCisjZGVmaW5lIEVHTF9TQU1QTEVTCQkJMHgzMDMxCisjZGVmaW5lIEVHTF9TQU1QTEVfQlVGRkVSUwkJMHgzMDMyCisjZGVmaW5lIEVHTF9TVVJGQUNFX1RZUEUJCTB4MzAzMworI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfVFlQRQkJMHgzMDM0CisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFCTB4MzAzNQorI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUJMHgzMDM2CisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUJMHgzMDM3CisjZGVmaW5lIEVHTF9OT05FCQkJMHgzMDM4CS8qIEF0dHJpYiBsaXN0IHRlcm1pbmF0b3IgKi8KKyNkZWZpbmUgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IJCTB4MzAzOQorI2RlZmluZSBFR0xfQklORF9UT19URVhUVVJFX1JHQkEJMHgzMDNBCisjZGVmaW5lIEVHTF9NSU5fU1dBUF9JTlRFUlZBTAkJMHgzMDNCCisjZGVmaW5lIEVHTF9NQVhfU1dBUF9JTlRFUlZBTAkJMHgzMDNDCisjZGVmaW5lIEVHTF9MVU1JTkFOQ0VfU0laRQkJMHgzMDNECisjZGVmaW5lIEVHTF9BTFBIQV9NQVNLX1NJWkUJCTB4MzAzRQorI2RlZmluZSBFR0xfQ09MT1JfQlVGRkVSX1RZUEUJCTB4MzAzRgorI2RlZmluZSBFR0xfUkVOREVSQUJMRV9UWVBFCQkweDMwNDAKKyNkZWZpbmUgRUdMX01BVENIX05BVElWRV9QSVhNQVAJCTB4MzA0MQkvKiBQc2V1ZG8tYXR0cmlidXRlIChub3QgcXVlcnlhYmxlKSAqLworI2RlZmluZSBFR0xfQ09ORk9STUFOVAkJCTB4MzA0MgorCisvKiBSZXNlcnZlZCAweDMwNDEtMHgzMDRGIGZvciBhZGRpdGlvbmFsIGNvbmZpZyBhdHRyaWJ1dGVzICovCisKKy8qIENvbmZpZyBhdHRyaWJ1dGUgdmFsdWVzICovCisjZGVmaW5lIEVHTF9TTE9XX0NPTkZJRwkJCTB4MzA1MAkvKiBFR0xfQ09ORklHX0NBVkVBVCB2YWx1ZSAqLworI2RlZmluZSBFR0xfTk9OX0NPTkZPUk1BTlRfQ09ORklHCTB4MzA1MQkvKiBFR0xfQ09ORklHX0NBVkVBVCB2YWx1ZSAqLworI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfUkdCCQkweDMwNTIJLyogRUdMX1RSQU5TUEFSRU5UX1RZUEUgdmFsdWUgKi8KKyNkZWZpbmUgRUdMX1JHQl9CVUZGRVIJCQkweDMwOEUJLyogRUdMX0NPTE9SX0JVRkZFUl9UWVBFIHZhbHVlICovCisjZGVmaW5lIEVHTF9MVU1JTkFOQ0VfQlVGRkVSCQkweDMwOEYJLyogRUdMX0NPTE9SX0JVRkZFUl9UWVBFIHZhbHVlICovCisKKy8qIE1vcmUgY29uZmlnIGF0dHJpYnV0ZSB2YWx1ZXMsIGZvciBFR0xfVEVYVFVSRV9GT1JNQVQgKi8KKyNkZWZpbmUgRUdMX05PX1RFWFRVUkUJCQkweDMwNUMKKyNkZWZpbmUgRUdMX1RFWFRVUkVfUkdCCQkJMHgzMDVECisjZGVmaW5lIEVHTF9URVhUVVJFX1JHQkEJCTB4MzA1RQorI2RlZmluZSBFR0xfVEVYVFVSRV8yRAkJCTB4MzA1RgorCisvKiBDb25maWcgYXR0cmlidXRlIG1hc2sgYml0cyAqLworI2RlZmluZSBFR0xfUEJVRkZFUl9CSVQJCQkweDAwMDEJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX1BJWE1BUF9CSVQJCQkweDAwMDIJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX1dJTkRPV19CSVQJCQkweDAwMDQJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX1ZHX0NPTE9SU1BBQ0VfTElORUFSX0JJVAkweDAwMjAJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX1ZHX0FMUEhBX0ZPUk1BVF9QUkVfQklUCTB4MDA0MAkvKiBFR0xfU1VSRkFDRV9UWVBFIG1hc2sgYml0cyAqLworI2RlZmluZSBFR0xfTVVMVElTQU1QTEVfUkVTT0xWRV9CT1hfQklUIDB4MDIwMAkvKiBFR0xfU1VSRkFDRV9UWVBFIG1hc2sgYml0cyAqLworI2RlZmluZSBFR0xfU1dBUF9CRUhBVklPUl9QUkVTRVJWRURfQklUIDB4MDQwMAkvKiBFR0xfU1VSRkFDRV9UWVBFIG1hc2sgYml0cyAqLworCisjZGVmaW5lIEVHTF9PUEVOR0xfRVNfQklUCQkweDAwMDEJLyogRUdMX1JFTkRFUkFCTEVfVFlQRSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX09QRU5WR19CSVQJCQkweDAwMDIJLyogRUdMX1JFTkRFUkFCTEVfVFlQRSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX09QRU5HTF9FUzJfQklUCQkweDAwMDQJLyogRUdMX1JFTkRFUkFCTEVfVFlQRSBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRUdMX09QRU5HTF9CSVQJCQkweDAwMDgJLyogRUdMX1JFTkRFUkFCTEVfVFlQRSBtYXNrIGJpdHMgKi8KKworLyogUXVlcnlTdHJpbmcgdGFyZ2V0cyAqLworI2RlZmluZSBFR0xfVkVORE9SCQkJMHgzMDUzCisjZGVmaW5lIEVHTF9WRVJTSU9OCQkJMHgzMDU0CisjZGVmaW5lIEVHTF9FWFRFTlNJT05TCQkJMHgzMDU1CisjZGVmaW5lIEVHTF9DTElFTlRfQVBJUwkJCTB4MzA4RAorCisvKiBRdWVyeVN1cmZhY2UgLyBTdXJmYWNlQXR0cmliIC8gQ3JlYXRlUGJ1ZmZlclN1cmZhY2UgdGFyZ2V0cyAqLworI2RlZmluZSBFR0xfSEVJR0hUCQkJMHgzMDU2CisjZGVmaW5lIEVHTF9XSURUSAkJCTB4MzA1NworI2RlZmluZSBFR0xfTEFSR0VTVF9QQlVGRkVSCQkweDMwNTgKKyNkZWZpbmUgRUdMX1RFWFRVUkVfRk9STUFUCQkweDMwODAKKyNkZWZpbmUgRUdMX1RFWFRVUkVfVEFSR0VUCQkweDMwODEKKyNkZWZpbmUgRUdMX01JUE1BUF9URVhUVVJFCQkweDMwODIKKyNkZWZpbmUgRUdMX01JUE1BUF9MRVZFTAkJMHgzMDgzCisjZGVmaW5lIEVHTF9SRU5ERVJfQlVGRkVSCQkweDMwODYKKyNkZWZpbmUgRUdMX1ZHX0NPTE9SU1BBQ0UJCTB4MzA4NworI2RlZmluZSBFR0xfVkdfQUxQSEFfRk9STUFUCQkweDMwODgKKyNkZWZpbmUgRUdMX0hPUklaT05UQUxfUkVTT0xVVElPTgkweDMwOTAKKyNkZWZpbmUgRUdMX1ZFUlRJQ0FMX1JFU09MVVRJT04JCTB4MzA5MQorI2RlZmluZSBFR0xfUElYRUxfQVNQRUNUX1JBVElPCQkweDMwOTIKKyNkZWZpbmUgRUdMX1NXQVBfQkVIQVZJT1IJCTB4MzA5MworI2RlZmluZSBFR0xfTVVMVElTQU1QTEVfUkVTT0xWRQkJMHgzMDk5CisKKy8qIEVHTF9SRU5ERVJfQlVGRkVSIHZhbHVlcyAvIEJpbmRUZXhJbWFnZSAvIFJlbGVhc2VUZXhJbWFnZSBidWZmZXIgdGFyZ2V0cyAqLworI2RlZmluZSBFR0xfQkFDS19CVUZGRVIJCQkweDMwODQKKyNkZWZpbmUgRUdMX1NJTkdMRV9CVUZGRVIJCTB4MzA4NQorCisvKiBPcGVuVkcgY29sb3Igc3BhY2VzICovCisjZGVmaW5lIEVHTF9WR19DT0xPUlNQQUNFX3NSR0IJCTB4MzA4OQkvKiBFR0xfVkdfQ09MT1JTUEFDRSB2YWx1ZSAqLworI2RlZmluZSBFR0xfVkdfQ09MT1JTUEFDRV9MSU5FQVIJMHgzMDhBCS8qIEVHTF9WR19DT0xPUlNQQUNFIHZhbHVlICovCisKKy8qIE9wZW5WRyBhbHBoYSBmb3JtYXRzICovCisjZGVmaW5lIEVHTF9WR19BTFBIQV9GT1JNQVRfTk9OUFJFCTB4MzA4QgkvKiBFR0xfQUxQSEFfRk9STUFUIHZhbHVlICovCisjZGVmaW5lIEVHTF9WR19BTFBIQV9GT1JNQVRfUFJFCQkweDMwOEMJLyogRUdMX0FMUEhBX0ZPUk1BVCB2YWx1ZSAqLworCisvKiBDb25zdGFudCBzY2FsZSBmYWN0b3IgYnkgd2hpY2ggZnJhY3Rpb25hbCBkaXNwbGF5IHJlc29sdXRpb25zICYKKyAqIGFzcGVjdCByYXRpbyBhcmUgc2NhbGVkIHdoZW4gcXVlcmllZCBhcyBpbnRlZ2VyIHZhbHVlcy4KKyAqLworI2RlZmluZSBFR0xfRElTUExBWV9TQ0FMSU5HCQkxMDAwMAorCisvKiBVbmtub3duIGRpc3BsYXkgcmVzb2x1dGlvbi9hc3BlY3QgcmF0aW8gKi8KKyNkZWZpbmUgRUdMX1VOS05PV04JCQkoKEVHTGludCktMSkKKworLyogQmFjayBidWZmZXIgc3dhcCBiZWhhdmlvcnMgKi8KKyNkZWZpbmUgRUdMX0JVRkZFUl9QUkVTRVJWRUQJCTB4MzA5NAkvKiBFR0xfU1dBUF9CRUhBVklPUiB2YWx1ZSAqLworI2RlZmluZSBFR0xfQlVGRkVSX0RFU1RST1lFRAkJMHgzMDk1CS8qIEVHTF9TV0FQX0JFSEFWSU9SIHZhbHVlICovCisKKy8qIENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyIGJ1ZmZlciB0eXBlcyAqLworI2RlZmluZSBFR0xfT1BFTlZHX0lNQUdFCQkweDMwOTYKKworLyogUXVlcnlDb250ZXh0IHRhcmdldHMgKi8KKyNkZWZpbmUgRUdMX0NPTlRFWFRfQ0xJRU5UX1RZUEUJCTB4MzA5NworCisvKiBDcmVhdGVDb250ZXh0IGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04JMHgzMDk4CisKKy8qIE11bHRpc2FtcGxlIHJlc29sdXRpb24gYmVoYXZpb3JzICovCisjZGVmaW5lIEVHTF9NVUxUSVNBTVBMRV9SRVNPTFZFX0RFRkFVTFQgMHgzMDlBCS8qIEVHTF9NVUxUSVNBTVBMRV9SRVNPTFZFIHZhbHVlICovCisjZGVmaW5lIEVHTF9NVUxUSVNBTVBMRV9SRVNPTFZFX0JPWAkweDMwOUIJLyogRUdMX01VTFRJU0FNUExFX1JFU09MVkUgdmFsdWUgKi8KKworLyogQmluZEFQSS9RdWVyeUFQSSB0YXJnZXRzICovCisjZGVmaW5lIEVHTF9PUEVOR0xfRVNfQVBJCQkweDMwQTAKKyNkZWZpbmUgRUdMX09QRU5WR19BUEkJCQkweDMwQTEKKyNkZWZpbmUgRUdMX09QRU5HTF9BUEkJCQkweDMwQTIKKworLyogR2V0Q3VycmVudFN1cmZhY2UgdGFyZ2V0cyAqLworI2RlZmluZSBFR0xfRFJBVwkJCTB4MzA1OQorI2RlZmluZSBFR0xfUkVBRAkJCTB4MzA1QQorCisvKiBXYWl0TmF0aXZlIGVuZ2luZXMgKi8KKyNkZWZpbmUgRUdMX0NPUkVfTkFUSVZFX0VOR0lORQkJMHgzMDVCCisKKy8qIEVHTCAxLjIgdG9rZW5zIHJlbmFtZWQgZm9yIGNvbnNpc3RlbmN5IGluIEVHTCAxLjMgKi8KKyNkZWZpbmUgRUdMX0NPTE9SU1BBQ0UJCQlFR0xfVkdfQ09MT1JTUEFDRQorI2RlZmluZSBFR0xfQUxQSEFfRk9STUFUCQlFR0xfVkdfQUxQSEFfRk9STUFUCisjZGVmaW5lIEVHTF9DT0xPUlNQQUNFX3NSR0IJCUVHTF9WR19DT0xPUlNQQUNFX3NSR0IKKyNkZWZpbmUgRUdMX0NPTE9SU1BBQ0VfTElORUFSCQlFR0xfVkdfQ09MT1JTUEFDRV9MSU5FQVIKKyNkZWZpbmUgRUdMX0FMUEhBX0ZPUk1BVF9OT05QUkUJCUVHTF9WR19BTFBIQV9GT1JNQVRfTk9OUFJFCisjZGVmaW5lIEVHTF9BTFBIQV9GT1JNQVRfUFJFCQlFR0xfVkdfQUxQSEFfRk9STUFUX1BSRQorCisvKiBFR0wgZXh0ZW5zaW9ucyBtdXN0IHJlcXVlc3QgZW51bSBibG9ja3MgZnJvbSB0aGUgS2hyb25vcworICogQVBJIFJlZ2lzdHJhciwgd2hvIG1haW50YWlucyB0aGUgZW51bWVyYW50IHJlZ2lzdHJ5LiBTdWJtaXQKKyAqIGEgYnVnIGluIEtocm9ub3MgQnVnemlsbGEgYWdhaW5zdCB0YXNrICJSZWdpc3RyeSIuCisgKi8KKworCisKKy8qIEVHTCBGdW5jdGlvbnMgKi8KKworRUdMQVBJIEVHTGludCBFR0xBUElFTlRSWSBlZ2xHZXRFcnJvcih2b2lkKTsKKworRUdMQVBJIEVHTERpc3BsYXkgRUdMQVBJRU5UUlkgZWdsR2V0RGlzcGxheShFR0xOYXRpdmVEaXNwbGF5VHlwZSBkaXNwbGF5X2lkKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbEluaXRpYWxpemUoRUdMRGlzcGxheSBkcHksIEVHTGludCAqbWFqb3IsIEVHTGludCAqbWlub3IpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsVGVybWluYXRlKEVHTERpc3BsYXkgZHB5KTsKKworRUdMQVBJIGNvbnN0IGNoYXIgKiBFR0xBUElFTlRSWSBlZ2xRdWVyeVN0cmluZyhFR0xEaXNwbGF5IGRweSwgRUdMaW50IG5hbWUpOworCitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xHZXRDb25maWdzKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgKmNvbmZpZ3MsCisJCQkgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQgKm51bV9jb25maWcpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsQ2hvb3NlQ29uZmlnKEVHTERpc3BsYXkgZHB5LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0LAorCQkJICAgRUdMQ29uZmlnICpjb25maWdzLCBFR0xpbnQgY29uZmlnX3NpemUsCisJCQkgICBFR0xpbnQgKm51bV9jb25maWcpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsR2V0Q29uZmlnQXR0cmliKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorCQkJICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisKK0VHTEFQSSBFR0xTdXJmYWNlIEVHTEFQSUVOVFJZIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCisJCQkJICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbiwKKwkJCQkgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTFN1cmZhY2UgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCisJCQkJICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitFR0xBUEkgRUdMU3VyZmFjZSBFR0xBUElFTlRSWSBlZ2xDcmVhdGVQaXhtYXBTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorCQkJCSAgRUdMTmF0aXZlUGl4bWFwVHlwZSBwaXhtYXAsCisJCQkJICBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbERlc3Ryb3lTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsUXVlcnlTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsCisJCQkgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKKworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsQmluZEFQSShFR0xlbnVtIGFwaSk7CitFR0xBUEkgRUdMZW51bSBFR0xBUElFTlRSWSBlZ2xRdWVyeUFQSSh2b2lkKTsKKworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsV2FpdENsaWVudCh2b2lkKTsKKworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsUmVsZWFzZVRocmVhZCh2b2lkKTsKKworRUdMQVBJIEVHTFN1cmZhY2UgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlUGJ1ZmZlckZyb21DbGllbnRCdWZmZXIoCisJICAgICAgRUdMRGlzcGxheSBkcHksIEVHTGVudW0gYnVmdHlwZSwgRUdMQ2xpZW50QnVmZmVyIGJ1ZmZlciwKKwkgICAgICBFR0xDb25maWcgY29uZmlnLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKKworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsU3VyZmFjZUF0dHJpYihFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLAorCQkJICAgIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCB2YWx1ZSk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xCaW5kVGV4SW1hZ2UoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGJ1ZmZlcik7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xSZWxlYXNlVGV4SW1hZ2UoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGJ1ZmZlcik7CisKKworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsU3dhcEludGVydmFsKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgaW50ZXJ2YWwpOworCisKK0VHTEFQSSBFR0xDb250ZXh0IEVHTEFQSUVOVFJZIGVnbENyZWF0ZUNvbnRleHQoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCisJCQkgICAgRUdMQ29udGV4dCBzaGFyZV9jb250ZXh0LAorCQkJICAgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsRGVzdHJveUNvbnRleHQoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4KTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbE1ha2VDdXJyZW50KEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcsCisJCQkgIEVHTFN1cmZhY2UgcmVhZCwgRUdMQ29udGV4dCBjdHgpOworCitFR0xBUEkgRUdMQ29udGV4dCBFR0xBUElFTlRSWSBlZ2xHZXRDdXJyZW50Q29udGV4dCh2b2lkKTsKK0VHTEFQSSBFR0xTdXJmYWNlIEVHTEFQSUVOVFJZIGVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTGludCByZWFkZHJhdyk7CitFR0xBUEkgRUdMRGlzcGxheSBFR0xBUElFTlRSWSBlZ2xHZXRDdXJyZW50RGlzcGxheSh2b2lkKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFF1ZXJ5Q29udGV4dChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgsCisJCQkgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKKworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsV2FpdEdMKHZvaWQpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsV2FpdE5hdGl2ZShFR0xpbnQgZW5naW5lKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFN3YXBCdWZmZXJzKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsQ29weUJ1ZmZlcnMoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwKKwkJCSAgRUdMTmF0aXZlUGl4bWFwVHlwZSB0YXJnZXQpOworCisvKiBUaGlzIGlzIGEgZ2VuZXJpYyBmdW5jdGlvbiBwb2ludGVyIHR5cGUsIHdob3NlIG5hbWUgaW5kaWNhdGVzIGl0IG11c3QKKyAqIGJlIGNhc3QgdG8gdGhlIHByb3BlciB0eXBlICphbmQgY2FsbGluZyBjb252ZW50aW9uKiBiZWZvcmUgdXNlLgorICovCit0eXBlZGVmIHZvaWQgKCpfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSh2b2lkKTsKKworLyogTm93LCBkZWZpbmUgZWdsR2V0UHJvY0FkZHJlc3MgdXNpbmcgdGhlIGdlbmVyaWMgZnVuY3Rpb24gcHRyLiB0eXBlICovCitFR0xBUEkgX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSBFR0xBUElFTlRSWQorICAgICAgIGVnbEdldFByb2NBZGRyZXNzKGNvbnN0IGNoYXIgKnByb2NuYW1lKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fZWdsX2hfICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvaW5jbHVkZS9FR0wvZWdsZXh0LmggYi9vcGVuZ2wvaW5jbHVkZS9FR0wvZWdsZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjZmNiOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2xleHQuaApAQCAtMCwwICsxLDEzOCBAQAorI2lmbmRlZiBfX2VnbGV4dF9oXworI2RlZmluZSBfX2VnbGV4dF9oXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKgorKiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyoqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyoqICJNYXRlcmlhbHMiKSwgdG8gZGVhbCBpbiB0aGUgTWF0ZXJpYWxzIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworKiogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorKiogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBNYXRlcmlhbHMsIGFuZCB0bworKiogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgTWF0ZXJpYWxzIGFyZSBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyoqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyoqCisqKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgTWF0ZXJpYWxzLgorKioKKyoqIFRIRSBNQVRFUklBTFMgQVJFIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyoqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisqKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorKiogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyoqIE1BVEVSSUFMUyBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBNQVRFUklBTFMuCisqLworCisjaW5jbHVkZSA8RUdML2VnbHBsYXRmb3JtLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBIZWFkZXIgZmlsZSB2ZXJzaW9uIG51bWJlciAqLworLyogQ3VycmVudCB2ZXJzaW9uIGF0IGh0dHA6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvZWdsLyAqLworLyogJFJldmlzaW9uOiA3MjQ0ICQgb24gJERhdGU6IDIwMDktMDEtMjAgMTc6MDY6NTkgLTA4MDAgKFR1ZSwgMjAgSmFuIDIwMDkpICQgKi8KKyNkZWZpbmUgRUdMX0VHTEVYVF9WRVJTSU9OIDMKKworI2lmbmRlZiBFR0xfS0hSX2NvbmZpZ19hdHRyaWJzCisjZGVmaW5lIEVHTF9LSFJfY29uZmlnX2F0dHJpYnMgMQorI2RlZmluZSBFR0xfQ09ORk9STUFOVF9LSFIJCQkweDMwNDIJLyogRUdMQ29uZmlnIGF0dHJpYnV0ZSAqLworI2RlZmluZSBFR0xfVkdfQ09MT1JTUEFDRV9MSU5FQVJfQklUX0tIUgkweDAwMjAJLyogRUdMX1NVUkZBQ0VfVFlQRSBiaXRmaWVsZCAqLworI2RlZmluZSBFR0xfVkdfQUxQSEFfRk9STUFUX1BSRV9CSVRfS0hSCQkweDAwNDAJLyogRUdMX1NVUkZBQ0VfVFlQRSBiaXRmaWVsZCAqLworI2VuZGlmCisKKyNpZm5kZWYgRUdMX0tIUl9sb2NrX3N1cmZhY2UKKyNkZWZpbmUgRUdMX0tIUl9sb2NrX3N1cmZhY2UgMQorI2RlZmluZSBFR0xfUkVBRF9TVVJGQUNFX0JJVF9LSFIJCTB4MDAwMQkvKiBFR0xfTE9DS19VU0FHRV9ISU5UX0tIUiBiaXRmaWVsZCAqLworI2RlZmluZSBFR0xfV1JJVEVfU1VSRkFDRV9CSVRfS0hSCQkweDAwMDIJLyogRUdMX0xPQ0tfVVNBR0VfSElOVF9LSFIgYml0ZmllbGQgKi8KKyNkZWZpbmUgRUdMX0xPQ0tfU1VSRkFDRV9CSVRfS0hSCQkweDAwODAJLyogRUdMX1NVUkZBQ0VfVFlQRSBiaXRmaWVsZCAqLworI2RlZmluZSBFR0xfT1BUSU1BTF9GT1JNQVRfQklUX0tIUgkJMHgwMTAwCS8qIEVHTF9TVVJGQUNFX1RZUEUgYml0ZmllbGQgKi8KKyNkZWZpbmUgRUdMX01BVENIX0ZPUk1BVF9LSFIJCQkweDMwNDMJLyogRUdMQ29uZmlnIGF0dHJpYnV0ZSAqLworI2RlZmluZSBFR0xfRk9STUFUX1JHQl81NjVfRVhBQ1RfS0hSCQkweDMwQzAJLyogRUdMX01BVENIX0ZPUk1BVF9LSFIgdmFsdWUgKi8KKyNkZWZpbmUgRUdMX0ZPUk1BVF9SR0JfNTY1X0tIUgkJCTB4MzBDMQkvKiBFR0xfTUFUQ0hfRk9STUFUX0tIUiB2YWx1ZSAqLworI2RlZmluZSBFR0xfRk9STUFUX1JHQkFfODg4OF9FWEFDVF9LSFIJCTB4MzBDMgkvKiBFR0xfTUFUQ0hfRk9STUFUX0tIUiB2YWx1ZSAqLworI2RlZmluZSBFR0xfRk9STUFUX1JHQkFfODg4OF9LSFIJCTB4MzBDMwkvKiBFR0xfTUFUQ0hfRk9STUFUX0tIUiB2YWx1ZSAqLworI2RlZmluZSBFR0xfTUFQX1BSRVNFUlZFX1BJWEVMU19LSFIJCTB4MzBDNAkvKiBlZ2xMb2NrU3VyZmFjZUtIUiBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgRUdMX0xPQ0tfVVNBR0VfSElOVF9LSFIJCQkweDMwQzUJLyogZWdsTG9ja1N1cmZhY2VLSFIgYXR0cmlidXRlICovCisjZGVmaW5lIEVHTF9CSVRNQVBfUE9JTlRFUl9LSFIJCQkweDMwQzYJLyogZWdsUXVlcnlTdXJmYWNlIGF0dHJpYnV0ZSAqLworI2RlZmluZSBFR0xfQklUTUFQX1BJVENIX0tIUgkJCTB4MzBDNwkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCisjZGVmaW5lIEVHTF9CSVRNQVBfT1JJR0lOX0tIUgkJCTB4MzBDOAkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCisjZGVmaW5lIEVHTF9CSVRNQVBfUElYRUxfUkVEX09GRlNFVF9LSFIJCTB4MzBDOQkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCisjZGVmaW5lIEVHTF9CSVRNQVBfUElYRUxfR1JFRU5fT0ZGU0VUX0tIUgkweDMwQ0EJLyogZWdsUXVlcnlTdXJmYWNlIGF0dHJpYnV0ZSAqLworI2RlZmluZSBFR0xfQklUTUFQX1BJWEVMX0JMVUVfT0ZGU0VUX0tIUgkweDMwQ0IJLyogZWdsUXVlcnlTdXJmYWNlIGF0dHJpYnV0ZSAqLworI2RlZmluZSBFR0xfQklUTUFQX1BJWEVMX0FMUEhBX09GRlNFVF9LSFIJMHgzMENDCS8qIGVnbFF1ZXJ5U3VyZmFjZSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgRUdMX0JJVE1BUF9QSVhFTF9MVU1JTkFOQ0VfT0ZGU0VUX0tIUgkweDMwQ0QJLyogZWdsUXVlcnlTdXJmYWNlIGF0dHJpYnV0ZSAqLworI2RlZmluZSBFR0xfTE9XRVJfTEVGVF9LSFIJCQkweDMwQ0UJLyogRUdMX0JJVE1BUF9PUklHSU5fS0hSIHZhbHVlICovCisjZGVmaW5lIEVHTF9VUFBFUl9MRUZUX0tIUgkJCTB4MzBDRgkvKiBFR0xfQklUTUFQX09SSUdJTl9LSFIgdmFsdWUgKi8KKyNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbExvY2tTdXJmYWNlS0hSIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xVbmxvY2tTdXJmYWNlS0hSIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTFN1cmZhY2Ugc3VyZmFjZSk7CisjZW5kaWYgLyogRUdMX0VHTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xMT0NLU1VSRkFDRUtIUlBST0MpIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Cit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xVTkxPQ0tTVVJGQUNFS0hSUFJPQykgKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKKyNlbmRpZgorCisjaWZuZGVmIEVHTF9LSFJfaW1hZ2UKKyNkZWZpbmUgRUdMX0tIUl9pbWFnZSAxCisjZGVmaW5lIEVHTF9OQVRJVkVfUElYTUFQX0tIUgkJCTB4MzBCMAkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KK3R5cGVkZWYgdm9pZCAqRUdMSW1hZ2VLSFI7CisjZGVmaW5lIEVHTF9OT19JTUFHRV9LSFIJCQkoKEVHTEltYWdlS0hSKTApCisjaWZkZWYgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCitFR0xBUEkgRUdMSW1hZ2VLSFIgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlSW1hZ2VLSFIgKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCwgRUdMZW51bSB0YXJnZXQsIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsRGVzdHJveUltYWdlS0hSIChFR0xEaXNwbGF5IGRweSwgRUdMSW1hZ2VLSFIgaW1hZ2UpOworI2VuZGlmIC8qIEVHTF9FR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBFR0xJbWFnZUtIUiAoRUdMQVBJRU5UUllQIFBGTkVHTENSRUFURUlNQUdFS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCwgRUdMZW51bSB0YXJnZXQsIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMREVTVFJPWUlNQUdFS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xJbWFnZUtIUiBpbWFnZSk7CisjZW5kaWYKKworI2lmbmRlZiBFR0xfS0hSX3ZnX3BhcmVudF9pbWFnZQorI2RlZmluZSBFR0xfS0hSX3ZnX3BhcmVudF9pbWFnZSAxCisjZGVmaW5lIEVHTF9WR19QQVJFTlRfSU1BR0VfS0hSCQkJMHgzMEJBCS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLworI2VuZGlmCisKKyNpZm5kZWYgRUdMX0tIUl9nbF90ZXh0dXJlXzJEX2ltYWdlCisjZGVmaW5lIEVHTF9LSFJfZ2xfdGV4dHVyZV8yRF9pbWFnZSAxCisjZGVmaW5lIEVHTF9HTF9URVhUVVJFXzJEX0tIUgkJCTB4MzBCMQkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KKyNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfTEVWRUxfS0hSCQkweDMwQkMJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgYXR0cmlidXRlICovCisjZW5kaWYKKworI2lmbmRlZiBFR0xfS0hSX2dsX3RleHR1cmVfY3ViZW1hcF9pbWFnZQorI2RlZmluZSBFR0xfS0hSX2dsX3RleHR1cmVfY3ViZW1hcF9pbWFnZSAxCisjZGVmaW5lIEVHTF9HTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hfS0hSCTB4MzBCMwkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KKyNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWF9LSFIJMHgzMEI0CS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLworI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZX0tIUgkweDMwQjUJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgdGFyZ2V0ICovCisjZGVmaW5lIEVHTF9HTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lfS0hSCTB4MzBCNgkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KKyNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWl9LSFIJMHgzMEI3CS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLworI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aX0tIUgkweDMwQjgJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgdGFyZ2V0ICovCisjZW5kaWYKKworI2lmbmRlZiBFR0xfS0hSX2dsX3RleHR1cmVfM0RfaW1hZ2UKKyNkZWZpbmUgRUdMX0tIUl9nbF90ZXh0dXJlXzNEX2ltYWdlIDEKKyNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfM0RfS0hSCQkJMHgzMEIyCS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLworI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9aT0ZGU0VUX0tIUgkJMHgzMEJECS8qIGVnbENyZWF0ZUltYWdlS0hSIGF0dHJpYnV0ZSAqLworI2VuZGlmCisKKyNpZm5kZWYgRUdMX0tIUl9nbF9yZW5kZXJidWZmZXJfaW1hZ2UKKyNkZWZpbmUgRUdMX0tIUl9nbF9yZW5kZXJidWZmZXJfaW1hZ2UgMQorI2RlZmluZSBFR0xfR0xfUkVOREVSQlVGRkVSX0tIUgkJCTB4MzBCOQkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KKyNlbmRpZgorCisjaWZuZGVmIEVHTF9LSFJfaW1hZ2VfYmFzZQorI2RlZmluZSBFR0xfS0hSX2ltYWdlX2Jhc2UgMQorLyogTW9zdCBpbnRlcmZhY2VzIGRlZmluZWQgYnkgRUdMX0tIUl9pbWFnZV9waXhtYXAgYWJvdmUgKi8KKyNkZWZpbmUgRUdMX0lNQUdFX1BSRVNFUlZFRF9LSFIJCQkweDMwRDIJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgYXR0cmlidXRlICovCisjZW5kaWYKKworI2lmbmRlZiBFR0xfS0hSX2ltYWdlX3BpeG1hcAorI2RlZmluZSBFR0xfS0hSX2ltYWdlX3BpeG1hcCAxCisvKiBJbnRlcmZhY2VzIGRlZmluZWQgYnkgRUdMX0tIUl9pbWFnZSBhYm92ZSAqLworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmdsL2luY2x1ZGUvRUdML2VnbG5hdGl2ZXMuaCBiL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2xuYXRpdmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2MjJkYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2xuYXRpdmVzLmgKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRUdMTkFUSVZFU19ICisjZGVmaW5lIEFORFJPSURfRUdMTkFUSVZFU19ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGZsYWdzIHJldHVybmVkIGZyb20gc3dhcEJ1ZmZlciAqLworI2RlZmluZSBFR0xfTkFUSVZFU19GTEFHX1NJWkVfQ0hBTkdFRCAgICAgICAweDAwMDAwMDAxCisKKy8qIHN1cmZhY2UgZmxhZ3MgKi8KKyNkZWZpbmUgRUdMX05BVElWRVNfRkxBR19ERVNUUk9ZX0JBQ0tCVUZGRVIgMHgwMDAwMDAwMQorCitlbnVtIG5hdGl2ZV9waXhlbF9mb3JtYXRfdAoreworICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfUkdCQV84ODg4ICAgPSAxLAorICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfUkdCXzU2NSAgICAgPSA0LAorICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfQkdSQV84ODg4ICAgPSA1LAorICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfUkdCQV81NTUxICAgPSA2LAorICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0ICAgPSA3LAorICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQPSAweDEwLAorICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1NQPSAweDExLAorfTsKKworZW51bSBuYXRpdmVfbWVtb3J5X3R5cGVfdAoreworICAgIE5BVElWRV9NRU1PUllfVFlQRV9QTUVNICAgICAgICAgPSAwLAorICAgIE5BVElWRV9NRU1PUllfVFlQRV9HUFUgICAgICAgICAgPSAxLAorICAgIE5BVElWRV9NRU1PUllfVFlQRV9GQiAgICAgICAgICAgPSAyLAorICAgIE5BVElWRV9NRU1PUllfVFlQRV9IRUFQICAgICAgICAgPSAxMjgKK307CisKKworc3RydWN0IGVnbF9uYXRpdmVfd2luZG93X3QKK3sKKyAgICAvKgorICAgICAqIG1hZ2ljIG11c3QgYmUgc2V0IHRvIDB4NjAwOTEzCisgICAgICovCisgICAgdWludDMyX3QgICAgbWFnaWM7CisgICAgCisgICAgLyoKKyAgICAgKiBtdXN0IGJlIHNpemVvZihlZ2xfbmF0aXZlX3dpbmRvd190KQorICAgICAqLworICAgIHVpbnQzMl90ICAgIHZlcnNpb247CisKKyAgICAvKgorICAgICAqIGlkZW50IGlzIHJlc2VydmVkIGZvciB0aGUgQW5kcm9pZCBwbGF0Zm9ybQorICAgICAqLworICAgIHVpbnQzMl90ICAgIGlkZW50OworICAgIAorICAgIC8qCisgICAgICogd2lkdGgsIGhlaWdodCBhbmQgc3RyaWRlIG9mIHRoZSB3aW5kb3cgaW4gcGl4ZWxzCisgICAgICogQW55IG9mIHRoZXNlIHZhbHVlIGNhbiBiZSBudWwgaW4gd2hpY2ggY2FzZSBHTCBjb21tYW5kcyBhcmUKKyAgICAgKiBhY2NlcHRlZCBhbmQgcHJvY2Vzc2VkIGFzIHVzdWFsLCBidXQgbm90IHJlbmRlcmluZyBvY2N1cnMuCisgICAgICovCisgICAgaW50ICAgICAgICAgd2lkdGg7ICAgICAgLy8gdz1oPTAgaXMgbGVnYWwKKyAgICBpbnQgICAgICAgICBoZWlnaHQ7CisgICAgaW50ICAgICAgICAgc3RyaWRlOworCisgICAgLyoKKyAgICAgKiBmb3JtYXQgb2YgdGhlIG5hdGl2ZSB3aW5kb3cgKHNlZSB1aS9QaXhlbEZvcm1hdC5oKQorICAgICAqLworICAgIGludCAgICAgICAgIGZvcm1hdDsKKyAgICAKKyAgICAvKgorICAgICAqIE9mZnNldCBvZiB0aGUgYml0cyBpbiB0aGUgVlJBTQorICAgICAqLworICAgIGludHB0cl90ICAgIG9mZnNldDsKKyAgICAKKyAgICAvKgorICAgICAqIGZsYWdzIGRlc2NyaWJpbmcgc29tZSBhdHRyaWJ1dGVzIG9mIHRoaXMgc3VyZmFjZQorICAgICAqIEVHTF9OQVRJVkVTX0ZMQUdfREVTVFJPWV9CQUNLQlVGRkVSOiBiYWNrYnVmZmVyIG5vdCBwcmVzZXJ2ZWQgYWZ0ZXIgCisgICAgICogZWdsU3dhcEJ1ZmZlcnMKKyAgICAgKi8KKyAgICB1aW50MzJfdCAgICBmbGFnczsKKyAgICAKKyAgICAvKgorICAgICAqIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIHJlc29sdXRpb24gaW4gRFBJCisgICAgICovCisgICAgZmxvYXQgICAgICAgeGRwaTsKKyAgICBmbG9hdCAgICAgICB5ZHBpOworICAgIAorICAgIC8qCisgICAgICogcmVmcmVzaCByYXRlIGluIGZyYW1lcyBwZXIgc2Vjb25kIChIeikKKyAgICAgKi8KKyAgICBmbG9hdCAgICAgICBmcHM7CisgICAgCisgICAgCisgICAgLyoKKyAgICAgKiAgQmFzZSBtZW1vcnkgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBzdXJmYWNlIGluIHRoZSBDUFUgc2lkZQorICAgICAqLworICAgIGludHB0cl90ICAgIGJhc2U7CisgICAgCisgICAgLyoKKyAgICAgKiAgSGVhcCB0aGUgb2Zmc2V0IGFib3ZlIGlzIGJhc2VkIGZyb20KKyAgICAgKi8KKyAgICBpbnQgICAgICAgICBmZDsKKyAgICAKKyAgICAvKgorICAgICAqICBNZW1vcnkgdHlwZSB0aGUgc3VyZmFjZSByZXNpZGVzIGludG8KKyAgICAgKi8KKyAgICB1aW50OF90ICAgICBtZW1vcnlfdHlwZTsKKyAgICAKKyAgICAvKgorICAgICAqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBNVVNUIEJFIFpFUk8uCisgICAgICovCisgICAgdWludDhfdCAgICAgcmVzZXJ2ZWRfcGFkWzNdOworICAgIGludCAgICAgICAgIHJlc2VydmVkWzhdOworICAgIAorICAgIC8qCisgICAgICogVmVydGljYWwgc3RyaWRlIChvbmx5IHJlbGV2YW50IHdpdGggcGxhbmFyIGZvcm1hdHMpIAorICAgICAqLworICAgIAorICAgIGludCAgICAgICAgIHZzdHJpZGU7CisKKyAgICAvKgorICAgICAqIEhvb2sgY2FsbGVkIGJ5IEVHTCB0byBob2xkIGEgcmVmZXJlbmNlIG9uIHRoaXMgc3RydWN0dXJlCisgICAgICovCisgICAgdm9pZCAgICAgICAgKCppbmNSZWYpKHN0cnVjdCBlZ2xfbmF0aXZlX3dpbmRvd190KiB3aW5kb3cpOworCisgICAgLyoKKyAgICAgKiBIb29rIGNhbGxlZCBieSBFR0wgdG8gcmVsZWFzZSBhIHJlZmVyZW5jZSBvbiB0aGlzIHN0cnVjdHVyZQorICAgICAqLworICAgIHZvaWQgICAgICAgICgqZGVjUmVmKShzdHJ1Y3QgZWdsX25hdGl2ZV93aW5kb3dfdCogd2luZG93KTsKKworICAgIC8qCisgICAgICogSG9vayBjYWxsZWQgYnkgRUdMIHRvIHBlcmZvcm0gYSBwYWdlIGZsaXAuIFRoaXMgZnVuY3Rpb24KKyAgICAgKiBtYXkgdXBkYXRlIHRoZSBzaXplIGF0dHJpYnV0ZXMgYWJvdmUsIGluIHdoaWNoIGNhc2UgaXQgcmV0dXJucworICAgICAqIHRoZSBFR0xfTkFUSVZFU19GTEFHX1NJWkVfQ0hBTkdFRCBiaXQgc2V0LgorICAgICAqLworICAgIHVpbnQzMl90ICAgICgqc3dhcEJ1ZmZlcnMpKHN0cnVjdCBlZ2xfbmF0aXZlX3dpbmRvd190KiB3aW5kb3cpOworICAgIAorICAgIC8qCisgICAgICogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIE1VU1QgQkUgWkVSTy4KKyAgICAgKi8KKyAgICB2b2lkICAgICAgICAoKnJlc2VydmVkX3Byb2NfMCkodm9pZCk7CisKKyAgICAvKgorICAgICAqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBNVVNUIEJFIFpFUk8uCisgICAgICovCisgICAgdm9pZCAgICAgICAgKCpyZXNlcnZlZF9wcm9jXzEpKHZvaWQpOworICAgIAorICAgIC8qCisgICAgICogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIE1VU1QgQkUgWkVSTy4KKyAgICAgKi8KKyAgICB2b2lkICAgICAgICAoKnJlc2VydmVkX3Byb2NfMikodm9pZCk7CisKKyAgICAKKyAgICAvKgorICAgICAqIEhvb2sgY2FsbGVkIGJ5IEVHTCB3aGVuIHRoZSBuYXRpdmUgc3VyZmFjZSBpcyBhc3NvY2lhdGVkIHRvIEVHTAorICAgICAqIChlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKS4gQ2FuIGJlIE5VTEwuCisgICAgICovCisgICAgdm9pZCAgICAgICAgKCpjb25uZWN0KShzdHJ1Y3QgZWdsX25hdGl2ZV93aW5kb3dfdCogd2luZG93KTsKKworICAgIC8qCisgICAgICogSG9vayBjYWxsZWQgYnkgRUdMIHdoZW4gZWdsRGVzdHJveVN1cmZhY2UgaXMgY2FsbGVkLiAgQ2FuIGJlIE5VTEwuCisgICAgICovCisgICAgdm9pZCAgICAgICAgKCpkaXNjb25uZWN0KShzdHJ1Y3QgZWdsX25hdGl2ZV93aW5kb3dfdCogd2luZG93KTsKKyAgICAKKyAgICAvKgorICAgICAqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBNVVNUIEJFIFpFUk8uCisgICAgICovCisgICAgdm9pZCAgICAgICAgKCpyZXNlcnZlZF9wcm9jWzExXSkodm9pZCk7CisgICAgCisgICAgLyoKKyAgICAgKiAgU29tZSBzdG9yYWdlIHJlc2VydmVkIGZvciB0aGUgb2VtIGRyaXZlci4KKyAgICAgKi8KKyAgICBpbnRwdHJfdCAgICBvZW1bNF07Cit9OworCisKK3N0cnVjdCBlZ2xfbmF0aXZlX3BpeG1hcF90Cit7CisgICAgaW50MzJfdCAgICAgdmVyc2lvbjsgICAgLyogbXVzdCBiZSAzMiAqLworICAgIGludDMyX3QgICAgIHdpZHRoOworICAgIGludDMyX3QgICAgIGhlaWdodDsKKyAgICBpbnQzMl90ICAgICBzdHJpZGU7CisgICAgdWludDhfdCogICAgZGF0YTsKKyAgICB1aW50OF90ICAgICBmb3JtYXQ7CisgICAgdWludDhfdCAgICAgcmZ1WzNdOworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgICAgY29tcHJlc3NlZEZvcm1hdDsKKyAgICAgICAgaW50MzJfdCAgICAgdnN0cmlkZTsKKyAgICB9OworICAgIGludDMyX3QgICAgIHJlc2VydmVkOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAKKyAqIFRoaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBOYXRpdmVXaW5kb3dUeXBlIHN1cmZhY2UKKyAqIHRoYXQgbWFwcyB0byB0aGUgd2hvbGUgc2NyZWVuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGltcGxlbWVudGVkIGluIGxpYnVpLnNvCisgKi8KKworc3RydWN0IGVnbF9uYXRpdmVfd2luZG93X3QqIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisgKiBPRU0ncyBlZ2wncyBsaWJyYXJ5IChsaWJoZ2wuc28pIG11c3QgaW1sZW1lbnQgdGhlc2UgaG9va3MgdG8gYWxsb2NhdGUKKyAqIHRoZSBHUFUgbWVtb3J5IHRoZXkgbmVlZCAgCisgKi8KKworCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8vIGZvciBpbnRlcm5hbCB1c2UKKyAgICB2b2lkKiAgIHVzZXI7CisgICAgLy8gdmlydHVhbCBhZGRyZXNzIG9mIHRoaXMgYXJlYQorICAgIHZvaWQqICAgYmFzZTsKKyAgICAvLyBzaXplIG9mIHRoaXMgYXJlYSBpbiBieXRlcworICAgIHNpemVfdCAgc2l6ZTsKKyAgICAvLyBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgYXJlYQorICAgIHZvaWQqICAgcGh5czsKKyAgICAvLyBvZmZzZXQgaW4gdGhpcyBhcmVhIGF2YWlsYWJsZSB0byB0aGUgR1BVCisgICAgc2l6ZV90ICBvZmZzZXQ7CisgICAgLy8gZmQgb2YgdGhpcyBhcmVhCisgICAgaW50ICAgICBmZDsKK30gZ3B1X2FyZWFfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvLyBhcmVhIHdoZXJlIEdQVSByZWdpc3RlcnMgYXJlIG1hcHBlZAorICAgIGdwdV9hcmVhX3QgcmVnczsKKyAgICAvLyBudW1iZXIgb2YgZXh0cmEgYXJlYXMgKGN1cnJlbnRseSBsaW1pdGVkIHRvIDIpCisgICAgaW50MzJfdCBjb3VudDsKKyAgICAvLyBleHRyYSBHUFUgYXJlYXMgKGN1cnJlbnRseSBsaW1pdGVkIHRvIDIpCisgICAgZ3B1X2FyZWFfdCBncHVbMl07Cit9IHJlcXVlc3RfZ3B1X3Q7CisKKwordHlwZWRlZiByZXF1ZXN0X2dwdV90KiAoKk9FTV9FR0xfYWNxdWlyZV9ncHVfdCkodm9pZCogdXNlcik7Cit0eXBlZGVmIGludCAoKk9FTV9FR0xfcmVsZWFzZV9ncHVfdCkodm9pZCogdXNlciwgcmVxdWVzdF9ncHVfdCogaGFuZGxlKTsKK3R5cGVkZWYgdm9pZCAoKnJlZ2lzdGVyX2dwdV90KQorICAgICAgICAodm9pZCogdXNlciwgT0VNX0VHTF9hY3F1aXJlX2dwdV90LCBPRU1fRUdMX3JlbGVhc2VfZ3B1X3QpOworCit2b2lkIG9lbV9yZWdpc3Rlcl9ncHUoCisgICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgIE9FTV9FR0xfYWNxdWlyZV9ncHVfdCBhY3F1aXJlLAorICAgICAgICBPRU1fRUdMX3JlbGVhc2VfZ3B1X3QgcmVsZWFzZSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQU5EUk9JRF9FR0xOQVRJVkVTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2xwbGF0Zm9ybS5oIGIvb3BlbmdsL2luY2x1ZGUvRUdML2VnbHBsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwMDkwMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2xwbGF0Zm9ybS5oCkBAIC0wLDAgKzEsMTE3IEBACisjaWZuZGVmIF9fZWdscGxhdGZvcm1faF8KKyNkZWZpbmUgX19lZ2xwbGF0Zm9ybV9oXworCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKioKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisqKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKgorKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyoqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4KKyoqCisqKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgorKi8KKworLyogUGxhdGZvcm0tc3BlY2lmaWMgdHlwZXMgYW5kIGRlZmluaXRpb25zIGZvciBlZ2wuaAorICogJFJldmlzaW9uOiA3MjQ0ICQgb24gJERhdGU6IDIwMDktMDEtMjAgMTc6MDY6NTkgLTA4MDAgKFR1ZSwgMjAgSmFuIDIwMDkpICQKKyAqCisgKiBBZG9wdGVycyBtYXkgbW9kaWZ5IGtocnBsYXRmb3JtLmggYW5kIHRoaXMgZmlsZSB0byBzdWl0IHRoZWlyIHBsYXRmb3JtLgorICogWW91IGFyZSBlbmNvdXJhZ2VkIHRvIHN1Ym1pdCBhbGwgbW9kaWZpY2F0aW9ucyB0byB0aGUgS2hyb25vcyBncm91cCBzbyB0aGF0CisgKiB0aGV5IGNhbiBiZSBpbmNsdWRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhpcyBmaWxlLiAgUGxlYXNlIHN1Ym1pdCBjaGFuZ2VzCisgKiBieSBzZW5kaW5nIHRoZW0gdG8gdGhlIHB1YmxpYyBLaHJvbm9zIEJ1Z3ppbGxhIChodHRwOi8va2hyb25vcy5vcmcvYnVnemlsbGEpCisgKiBieSBmaWxpbmcgYSBidWcgYWdhaW5zdCBwcm9kdWN0ICJFR0wiIGNvbXBvbmVudCAiUmVnaXN0cnkiLgorICovCisKKyNpbmNsdWRlIDxLSFIva2hycGxhdGZvcm0uaD4KKworLyogTWFjcm9zIHVzZWQgaW4gRUdMIGZ1bmN0aW9uIHByb3RvdHlwZSBkZWNsYXJhdGlvbnMuCisgKgorICogRUdMIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHJvdG90eXBlZCBhczoKKyAqCisgKiBFR0xBUEkgcmV0dXJuLXR5cGUgRUdMQVBJRU5UUlkgZWdsRnVuY3Rpb24oYXJndW1lbnRzKTsKKyAqIHR5cGVkZWYgcmV0dXJuLXR5cGUgKEVYUEFQSUVOVFJZUCBQRk5FR0xGVU5DVElPTlBST0MpIChhcmd1bWVudHMpOworICoKKyAqIEtIUk9OT1NfQVBJQ0FMTCBhbmQgS0hST05PU19BUElFTlRSWSBhcmUgZGVmaW5lZCBpbiBLSFIva2hycGxhdGZvcm0uaAorICovCisKKyNpZm5kZWYgRUdMQVBJCisjZGVmaW5lIEVHTEFQSSBLSFJPTk9TX0FQSUNBTEwKKyNlbmRpZgorCisjZGVmaW5lIEVHTEFQSUVOVFJZICBLSFJPTk9TX0FQSUVOVFJZCisjZGVmaW5lIEVHTEFQSUVOVFJZUCBLSFJPTk9TX0FQSUVOVFJZKgorCisvKiBUaGUgdHlwZXMgTmF0aXZlRGlzcGxheVR5cGUsIE5hdGl2ZVdpbmRvd1R5cGUsIGFuZCBOYXRpdmVQaXhtYXBUeXBlCisgKiBhcmUgYWxpYXNlcyBvZiB3aW5kb3ctc3lzdGVtLWRlcGVuZGVudCB0eXBlcywgc3VjaCBhcyBYIERpc3BsYXkgKiBvcgorICogV2luZG93cyBEZXZpY2UgQ29udGV4dC4gVGhleSBtdXN0IGJlIGRlZmluZWQgaW4gcGxhdGZvcm0tc3BlY2lmaWMKKyAqIGNvZGUgYmVsb3cuIFRoZSBFR0wtcHJlZml4ZWQgdmVyc2lvbnMgb2YgTmF0aXZlKlR5cGUgYXJlIHRoZSBzYW1lCisgKiB0eXBlcywgcmVuYW1lZCBpbiBFR0wgMS4zIHNvIGFsbCB0eXBlcyBpbiB0aGUgQVBJIHN0YXJ0IHdpdGggIkVHTCIuCisgKi8KKworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fVkMzMl9fKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKSAmJiAhZGVmaW5lZChfX1NDSVRFQ0hfU05BUF9fKSAvKiBXaW4zMiBhbmQgV2luQ0UgKi8KKyNpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyNlbmRpZgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKwordHlwZWRlZiBIREMgICAgIEVHTE5hdGl2ZURpc3BsYXlUeXBlOwordHlwZWRlZiBIQklUTUFQIEVHTE5hdGl2ZVBpeG1hcFR5cGU7Cit0eXBlZGVmIEhXTkQgICAgRUdMTmF0aXZlV2luZG93VHlwZTsKKworI2VsaWYgZGVmaW5lZChfX1dJTlNDV19fKSB8fCBkZWZpbmVkKF9fU1lNQklBTjMyX18pICAvKiBTeW1iaWFuICovCisKK3R5cGVkZWYgaW50ICAgRUdMTmF0aXZlRGlzcGxheVR5cGU7Cit0eXBlZGVmIHZvaWQgKkVHTE5hdGl2ZVdpbmRvd1R5cGU7Cit0eXBlZGVmIHZvaWQgKkVHTE5hdGl2ZVBpeG1hcFR5cGU7CisKKyNlbGlmIGRlZmluZWQoX191bml4X18pICYmICFkZWZpbmVkKEFORFJPSUQpCisKKy8qIFgxMSAodGVudGF0aXZlKSAgKi8KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorCit0eXBlZGVmIERpc3BsYXkgKkVHTE5hdGl2ZURpc3BsYXlUeXBlOwordHlwZWRlZiBQaXhtYXAgICBFR0xOYXRpdmVQaXhtYXBUeXBlOwordHlwZWRlZiBXaW5kb3cgICBFR0xOYXRpdmVXaW5kb3dUeXBlOworCisKKyNlbGlmIGRlZmluZWQoQU5EUk9JRCkKKworI2luY2x1ZGUgPEVHTC9lZ2xuYXRpdmVzLmg+CisKK3R5cGVkZWYgc3RydWN0IGVnbF9uYXRpdmVfd2luZG93X3QqICAgICBFR0xOYXRpdmVXaW5kb3dUeXBlOwordHlwZWRlZiBzdHJ1Y3QgZWdsX25hdGl2ZV9waXhtYXBfdCogICAgIEVHTE5hdGl2ZVBpeG1hcFR5cGU7Cit0eXBlZGVmIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMTmF0aXZlRGlzcGxheVR5cGU7CisKKyNlbHNlCisjZXJyb3IgIlBsYXRmb3JtIG5vdCByZWNvZ25pemVkIgorI2VuZGlmCisKKy8qIEVHTCAxLjIgdHlwZXMsIHJlbmFtZWQgZm9yIGNvbnNpc3RlbmN5IGluIEVHTCAxLjMgKi8KK3R5cGVkZWYgRUdMTmF0aXZlRGlzcGxheVR5cGUgTmF0aXZlRGlzcGxheVR5cGU7Cit0eXBlZGVmIEVHTE5hdGl2ZVBpeG1hcFR5cGUgIE5hdGl2ZVBpeG1hcFR5cGU7Cit0eXBlZGVmIEVHTE5hdGl2ZVdpbmRvd1R5cGUgIE5hdGl2ZVdpbmRvd1R5cGU7CisKKworLyogRGVmaW5lIEVHTGludC4gVGhpcyBtdXN0IGJlIGEgc2lnbmVkIGludGVncmFsIHR5cGUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4KKyAqIGFsbCBsZWdhbCBhdHRyaWJ1dGUgbmFtZXMgYW5kIHZhbHVlcyBwYXNzZWQgaW50byBhbmQgb3V0IG9mIEVHTCwgd2hldGhlcgorICogdGhlaXIgdHlwZSBpcyBib29sZWFuLCBiaXRtYXNrLCBlbnVtZXJhbnQgKHN5bWJvbGljIGNvbnN0YW50KSwgaW50ZWdlciwKKyAqIGhhbmRsZSwgb3Igb3RoZXIuICBXaGlsZSBpbiBnZW5lcmFsIGEgMzItYml0IGludGVnZXIgd2lsbCBzdWZmaWNlLCBpZgorICogaGFuZGxlcyBhcmUgNjQgYml0IHR5cGVzLCB0aGVuIEVHTGludCBzaG91bGQgYmUgZGVmaW5lZCBhcyBhIHNpZ25lZCA2NC1iaXQKKyAqIGludGVnZXIgdHlwZS4KKyAqLwordHlwZWRlZiBraHJvbm9zX2ludDMyX3QgRUdMaW50OworCisjZW5kaWYgLyogX19lZ2xwbGF0Zm9ybV9oICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvaW5jbHVkZS9HTEVTL2VnbC5oIGIvb3BlbmdsL2luY2x1ZGUvR0xFUy9lZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzc4ZTAwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2luY2x1ZGUvR0xFUy9lZ2wuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogU2tlbGV0b24gZWdsLmggdG8gcHJvdmlkZSBjb21wYXRpYmlsaXR5IGZvciBlYXJseSBHTEVTIDEuMAorICogYXBwbGljYXRpb25zLiBTZXZlcmFsIGVhcmx5IGltcGxlbWVudGF0aW9ucyBpbmNsdWRlZCBnbC5oCisgKiBpbiBlZ2wuaCBsZWFkaW5nIGFwcGxpY2F0aW9ucyB0byBpbmNsdWRlIG9ubHkgZWdsLmgKKyAqCisgKiAkUmV2aXNpb246IDYyNTIgJCBvbiAkRGF0ZTo6IDIwMDgtMDgtMDYgMTY6MzU6MDggLTA3MDAgIyQKKyAqLworCisjaWZuZGVmIF9fbGVnYWN5X2VnbF9oXworI2RlZmluZSBfX2xlZ2FjeV9lZ2xfaF8KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKyNlbmRpZiAvKiBfX2xlZ2FjeV9lZ2xfaF8gKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0dMRVMvZ2wuaCBiL29wZW5nbC9pbmNsdWRlL0dMRVMvZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZThiOTcxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2luY2x1ZGUvR0xFUy9nbC5oCkBAIC0wLDAgKzEsNzY5IEBACisjaWZuZGVmIF9fZ2xfaF8KKyNkZWZpbmUgX19nbF9oXworCisvKiAkUmV2aXNpb246IDcxNzIgJCBvbiAkRGF0ZTo6IDIwMDktMDEtMDkgMTE6MTc6NDEgLTA4MDAgIyQgKi8KKworI2luY2x1ZGUgPEdMRVMvZ2xwbGF0Zm9ybS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBUaGlzIGRvY3VtZW50IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTR0kgRnJlZSBTb2Z0d2FyZSBCIExpY2Vuc2UgVmVyc2lvbgorICogMi4wLiBGb3IgZGV0YWlscywgc2VlIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQi8gLgorICovCisKK3R5cGVkZWYgdm9pZCAgICAgICAgICAgICBHTHZvaWQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgR0xlbnVtOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgIEdMYm9vbGVhbjsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICBHTGJpdGZpZWxkOwordHlwZWRlZiBraHJvbm9zX2ludDhfdCAgIEdMYnl0ZTsKK3R5cGVkZWYgc2hvcnQgICAgICAgICAgICBHTHNob3J0OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgIEdMaW50OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgIEdMc2l6ZWk7Cit0eXBlZGVmIGtocm9ub3NfdWludDhfdCAgR0x1Ynl0ZTsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICBHTHVzaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICBHTHVpbnQ7Cit0eXBlZGVmIGtocm9ub3NfZmxvYXRfdCAgR0xmbG9hdDsKK3R5cGVkZWYga2hyb25vc19mbG9hdF90ICBHTGNsYW1wZjsKK3R5cGVkZWYga2hyb25vc19pbnQzMl90ICBHTGZpeGVkOwordHlwZWRlZiBraHJvbm9zX2ludDMyX3QgIEdMY2xhbXB4OworCit0eXBlZGVmIGtocm9ub3NfaW50cHRyX3QgR0xpbnRwdHI7Cit0eXBlZGVmIGtocm9ub3Nfc3NpemVfdCAgR0xzaXplaXB0cjsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogT3BlbkdMIEVTIGNvcmUgdmVyc2lvbnMgKi8KKyNkZWZpbmUgR0xfVkVSU0lPTl9FU19DTV8xXzAgICAgICAgICAgMQorI2RlZmluZSBHTF9WRVJTSU9OX0VTX0NMXzFfMCAgICAgICAgICAxCisjZGVmaW5lIEdMX1ZFUlNJT05fRVNfQ01fMV8xICAgICAgICAgIDEKKyNkZWZpbmUgR0xfVkVSU0lPTl9FU19DTF8xXzEgICAgICAgICAgMQorCisvKiBDbGVhckJ1ZmZlck1hc2sgKi8KKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKworLyogQm9vbGVhbiAqLworI2RlZmluZSBHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisvKiBCZWdpbk1vZGUgKi8KKyNkZWZpbmUgR0xfUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBHTF9MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEdMX0xJTkVfTE9PUCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgR0xfTElORV9TVFJJUCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBHTF9UUklBTkdMRVMgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEdMX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgR0xfVFJJQU5HTEVfRkFOICAgICAgICAgICAgICAgICAgIDB4MDAwNgorCisvKiBBbHBoYUZ1bmN0aW9uICovCisjZGVmaW5lIEdMX05FVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgR0xfTEVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMQorI2RlZmluZSBHTF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAyCisjZGVmaW5lIEdMX0xFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDMKKyNkZWZpbmUgR0xfR1JFQVRFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNAorI2RlZmluZSBHTF9OT1RFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA1CisjZGVmaW5lIEdMX0dFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDYKKyNkZWZpbmUgR0xfQUxXQVlTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNworCisvKiBCbGVuZGluZ0ZhY3RvckRlc3QgKi8KKyNkZWZpbmUgR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR0xfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICAgICAgICAgICAgMHgwMzAxCisjZGVmaW5lIEdMX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAweDAzMDIKKyNkZWZpbmUgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAgICAgICAgICAgIDB4MDMwMworI2RlZmluZSBHTF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgMHgwMzA0CisjZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgICAgICAgICAgICAweDAzMDUKKworLyogQmxlbmRpbmdGYWN0b3JTcmMgKi8KKy8qICAgICAgR0xfWkVSTyAqLworLyogICAgICBHTF9PTkUgKi8KKyNkZWZpbmUgR0xfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwNgorI2RlZmluZSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICAgICAgICAgICAgMHgwMzA3CisjZGVmaW5lIEdMX1NSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICAweDAzMDgKKy8qICAgICAgR0xfU1JDX0FMUEhBICovCisvKiAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgKi8KKy8qICAgICAgR0xfRFNUX0FMUEhBICovCisvKiAgICAgIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgKi8KKworLyogQ2xpcFBsYW5lTmFtZSAqLworI2RlZmluZSBHTF9DTElQX1BMQU5FMCAgICAgICAgICAgICAgICAgICAgMHgzMDAwCisjZGVmaW5lIEdMX0NMSVBfUExBTkUxICAgICAgICAgICAgICAgICAgICAweDMwMDEKKyNkZWZpbmUgR0xfQ0xJUF9QTEFORTIgICAgICAgICAgICAgICAgICAgIDB4MzAwMgorI2RlZmluZSBHTF9DTElQX1BMQU5FMyAgICAgICAgICAgICAgICAgICAgMHgzMDAzCisjZGVmaW5lIEdMX0NMSVBfUExBTkU0ICAgICAgICAgICAgICAgICAgICAweDMwMDQKKyNkZWZpbmUgR0xfQ0xJUF9QTEFORTUgICAgICAgICAgICAgICAgICAgIDB4MzAwNQorCisvKiBDb2xvck1hdGVyaWFsRmFjZSAqLworLyogICAgICBHTF9GUk9OVF9BTkRfQkFDSyAqLworCisvKiBDb2xvck1hdGVyaWFsUGFyYW1ldGVyICovCisvKiAgICAgIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgKi8KKworLyogQ29sb3JQb2ludGVyVHlwZSAqLworLyogICAgICBHTF9VTlNJR05FRF9CWVRFICovCisvKiAgICAgIEdMX0ZMT0FUICovCisvKiAgICAgIEdMX0ZJWEVEICovCisKKy8qIEN1bGxGYWNlTW9kZSAqLworI2RlZmluZSBHTF9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDA0CisjZGVmaW5lIEdMX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDUKKyNkZWZpbmUgR0xfRlJPTlRfQU5EX0JBQ0sgICAgICAgICAgICAgICAgIDB4MDQwOAorCisvKiBEZXB0aEZ1bmN0aW9uICovCisvKiAgICAgIEdMX05FVkVSICovCisvKiAgICAgIEdMX0xFU1MgKi8KKy8qICAgICAgR0xfRVFVQUwgKi8KKy8qICAgICAgR0xfTEVRVUFMICovCisvKiAgICAgIEdMX0dSRUFURVIgKi8KKy8qICAgICAgR0xfTk9URVFVQUwgKi8KKy8qICAgICAgR0xfR0VRVUFMICovCisvKiAgICAgIEdMX0FMV0FZUyAqLworCisvKiBFbmFibGVDYXAgKi8KKyNkZWZpbmUgR0xfRk9HICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEI2MAorI2RlZmluZSBHTF9MSUdIVElORyAgICAgICAgICAgICAgICAgICAgICAgMHgwQjUwCisjZGVmaW5lIEdMX1RFWFRVUkVfMkQgICAgICAgICAgICAgICAgICAgICAweDBERTEKKyNkZWZpbmUgR0xfQ1VMTF9GQUNFICAgICAgICAgICAgICAgICAgICAgIDB4MEI0NAorI2RlZmluZSBHTF9BTFBIQV9URVNUICAgICAgICAgICAgICAgICAgICAgMHgwQkMwCisjZGVmaW5lIEdMX0JMRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCRTIKKyNkZWZpbmUgR0xfQ09MT1JfTE9HSUNfT1AgICAgICAgICAgICAgICAgIDB4MEJGMgorI2RlZmluZSBHTF9ESVRIRVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQkQwCisjZGVmaW5lIEdMX1NURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICAweDBCOTAKKyNkZWZpbmUgR0xfREVQVEhfVEVTVCAgICAgICAgICAgICAgICAgICAgIDB4MEI3MQorLyogICAgICBHTF9MSUdIVDAgKi8KKy8qICAgICAgR0xfTElHSFQxICovCisvKiAgICAgIEdMX0xJR0hUMiAqLworLyogICAgICBHTF9MSUdIVDMgKi8KKy8qICAgICAgR0xfTElHSFQ0ICovCisvKiAgICAgIEdMX0xJR0hUNSAqLworLyogICAgICBHTF9MSUdIVDYgKi8KKy8qICAgICAgR0xfTElHSFQ3ICovCisjZGVmaW5lIEdMX1BPSU5UX1NNT09USCAgICAgICAgICAgICAgICAgICAweDBCMTAKKyNkZWZpbmUgR0xfTElORV9TTU9PVEggICAgICAgICAgICAgICAgICAgIDB4MEIyMAorI2RlZmluZSBHTF9TQ0lTU09SX1RFU1QgICAgICAgICAgICAgICAgICAgMHgwQzExCisjZGVmaW5lIEdMX0NPTE9SX01BVEVSSUFMICAgICAgICAgICAgICAgICAweDBCNTcKKyNkZWZpbmUgR0xfTk9STUFMSVpFICAgICAgICAgICAgICAgICAgICAgIDB4MEJBMQorI2RlZmluZSBHTF9SRVNDQUxFX05PUk1BTCAgICAgICAgICAgICAgICAgMHg4MDNBCisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAweDgwMzcKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZICAgICAgICAgICAgICAgICAgIDB4ODA3NAorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVkgICAgICAgICAgICAgICAgICAgMHg4MDc1CisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZICAgICAgICAgICAgICAgICAgICAweDgwNzYKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAgICAgICAgICAgIDB4ODA3OAorI2RlZmluZSBHTF9NVUxUSVNBTVBMRSAgICAgICAgICAgICAgICAgICAgMHg4MDlECisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSAgICAgICAweDgwOUUKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX09ORSAgICAgICAgICAgIDB4ODA5RgorI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0UgICAgICAgICAgICAgICAgMHg4MEEwCisKKy8qIEVycm9yQ29kZSAqLworI2RlZmluZSBHTF9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9JTlZBTElEX0VOVU0gICAgICAgICAgICAgICAgICAgMHgwNTAwCisjZGVmaW5lIEdMX0lOVkFMSURfVkFMVUUgICAgICAgICAgICAgICAgICAweDA1MDEKKyNkZWZpbmUgR0xfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgICAgICAgIDB4MDUwMgorI2RlZmluZSBHTF9TVEFDS19PVkVSRkxPVyAgICAgICAgICAgICAgICAgMHgwNTAzCisjZGVmaW5lIEdMX1NUQUNLX1VOREVSRkxPVyAgICAgICAgICAgICAgICAweDA1MDQKKyNkZWZpbmUgR0xfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgICAgIDB4MDUwNQorCisvKiBGb2dNb2RlICovCisvKiAgICAgIEdMX0xJTkVBUiAqLworI2RlZmluZSBHTF9FWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIEdMX0VYUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDEKKworLyogRm9nUGFyYW1ldGVyICovCisjZGVmaW5lIEdMX0ZPR19ERU5TSVRZICAgICAgICAgICAgICAgICAgICAweDBCNjIKKyNkZWZpbmUgR0xfRk9HX1NUQVJUICAgICAgICAgICAgICAgICAgICAgIDB4MEI2MworI2RlZmluZSBHTF9GT0dfRU5EICAgICAgICAgICAgICAgICAgICAgICAgMHgwQjY0CisjZGVmaW5lIEdMX0ZPR19NT0RFICAgICAgICAgICAgICAgICAgICAgICAweDBCNjUKKyNkZWZpbmUgR0xfRk9HX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MEI2NgorCisvKiBGcm9udEZhY2VEaXJlY3Rpb24gKi8KKyNkZWZpbmUgR0xfQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMAorI2RlZmluZSBHTF9DQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAxCisKKy8qIEdldFBOYW1lICovCisjZGVmaW5lIEdMX0NVUlJFTlRfQ09MT1IgICAgICAgICAgICAgICAgICAweDBCMDAKKyNkZWZpbmUgR0xfQ1VSUkVOVF9OT1JNQUwgICAgICAgICAgICAgICAgIDB4MEIwMgorI2RlZmluZSBHTF9DVVJSRU5UX1RFWFRVUkVfQ09PUkRTICAgICAgICAgMHgwQjAzCisjZGVmaW5lIEdMX1BPSU5UX1NJWkUgICAgICAgICAgICAgICAgICAgICAweDBCMTEKKyNkZWZpbmUgR0xfUE9JTlRfU0laRV9NSU4gICAgICAgICAgICAgICAgIDB4ODEyNgorI2RlZmluZSBHTF9QT0lOVF9TSVpFX01BWCAgICAgICAgICAgICAgICAgMHg4MTI3CisjZGVmaW5lIEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUgICAgICAweDgxMjgKKyNkZWZpbmUgR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT04gICAgIDB4ODEyOQorI2RlZmluZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgMHgwQjEyCisjZGVmaW5lIEdMX0xJTkVfV0lEVEggICAgICAgICAgICAgICAgICAgICAweDBCMjEKKyNkZWZpbmUgR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgIDB4MEIyMgorI2RlZmluZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgMHg4NDZECisjZGVmaW5lIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICAweDg0NkUKKyNkZWZpbmUgR0xfQ1VMTF9GQUNFX01PREUgICAgICAgICAgICAgICAgIDB4MEI0NQorI2RlZmluZSBHTF9GUk9OVF9GQUNFICAgICAgICAgICAgICAgICAgICAgMHgwQjQ2CisjZGVmaW5lIEdMX1NIQURFX01PREVMICAgICAgICAgICAgICAgICAgICAweDBCNTQKKyNkZWZpbmUgR0xfREVQVEhfUkFOR0UgICAgICAgICAgICAgICAgICAgIDB4MEI3MAorI2RlZmluZSBHTF9ERVBUSF9XUklURU1BU0sgICAgICAgICAgICAgICAgMHgwQjcyCisjZGVmaW5lIEdMX0RFUFRIX0NMRUFSX1ZBTFVFICAgICAgICAgICAgICAweDBCNzMKKyNkZWZpbmUgR0xfREVQVEhfRlVOQyAgICAgICAgICAgICAgICAgICAgIDB4MEI3NAorI2RlZmluZSBHTF9TVEVOQ0lMX0NMRUFSX1ZBTFVFICAgICAgICAgICAgMHgwQjkxCisjZGVmaW5lIEdMX1NURU5DSUxfRlVOQyAgICAgICAgICAgICAgICAgICAweDBCOTIKKyNkZWZpbmUgR0xfU1RFTkNJTF9WQUxVRV9NQVNLICAgICAgICAgICAgIDB4MEI5MworI2RlZmluZSBHTF9TVEVOQ0lMX0ZBSUwgICAgICAgICAgICAgICAgICAgMHgwQjk0CisjZGVmaW5lIEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMICAgICAgICAweDBCOTUKKyNkZWZpbmUgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MgICAgICAgIDB4MEI5NgorI2RlZmluZSBHTF9TVEVOQ0lMX1JFRiAgICAgICAgICAgICAgICAgICAgMHgwQjk3CisjZGVmaW5lIEdMX1NURU5DSUxfV1JJVEVNQVNLICAgICAgICAgICAgICAweDBCOTgKKyNkZWZpbmUgR0xfTUFUUklYX01PREUgICAgICAgICAgICAgICAgICAgIDB4MEJBMAorI2RlZmluZSBHTF9WSUVXUE9SVCAgICAgICAgICAgICAgICAgICAgICAgMHgwQkEyCisjZGVmaW5lIEdMX01PREVMVklFV19TVEFDS19ERVBUSCAgICAgICAgICAweDBCQTMKKyNkZWZpbmUgR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAgICAgICAgIDB4MEJBNAorI2RlZmluZSBHTF9URVhUVVJFX1NUQUNLX0RFUFRIICAgICAgICAgICAgMHgwQkE1CisjZGVmaW5lIEdMX01PREVMVklFV19NQVRSSVggICAgICAgICAgICAgICAweDBCQTYKKyNkZWZpbmUgR0xfUFJPSkVDVElPTl9NQVRSSVggICAgICAgICAgICAgIDB4MEJBNworI2RlZmluZSBHTF9URVhUVVJFX01BVFJJWCAgICAgICAgICAgICAgICAgMHgwQkE4CisjZGVmaW5lIEdMX0FMUEhBX1RFU1RfRlVOQyAgICAgICAgICAgICAgICAweDBCQzEKKyNkZWZpbmUgR0xfQUxQSEFfVEVTVF9SRUYgICAgICAgICAgICAgICAgIDB4MEJDMgorI2RlZmluZSBHTF9CTEVORF9EU1QgICAgICAgICAgICAgICAgICAgICAgMHgwQkUwCisjZGVmaW5lIEdMX0JMRU5EX1NSQyAgICAgICAgICAgICAgICAgICAgICAweDBCRTEKKyNkZWZpbmUgR0xfTE9HSUNfT1BfTU9ERSAgICAgICAgICAgICAgICAgIDB4MEJGMAorI2RlZmluZSBHTF9TQ0lTU09SX0JPWCAgICAgICAgICAgICAgICAgICAgMHgwQzEwCisjZGVmaW5lIEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAweDBDMTEKKyNkZWZpbmUgR0xfQ09MT1JfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgIDB4MEMyMgorI2RlZmluZSBHTF9DT0xPUl9XUklURU1BU0sgICAgICAgICAgICAgICAgMHgwQzIzCisjZGVmaW5lIEdMX1VOUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAweDBDRjUKKyNkZWZpbmUgR0xfUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAgIDB4MEQwNQorI2RlZmluZSBHTF9NQVhfTElHSFRTICAgICAgICAgICAgICAgICAgICAgMHgwRDMxCisjZGVmaW5lIEdMX01BWF9DTElQX1BMQU5FUyAgICAgICAgICAgICAgICAweDBEMzIKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgIDB4MEQzMworI2RlZmluZSBHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgICAgMHgwRDM2CisjZGVmaW5lIEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICAgICAweDBEMzgKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgIDB4MEQzOQorI2RlZmluZSBHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgMHgwRDNBCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX1VOSVRTICAgICAgICAgICAgICAweDg0RTIKKyNkZWZpbmUgR0xfU1VCUElYRUxfQklUUyAgICAgICAgICAgICAgICAgIDB4MEQ1MAorI2RlZmluZSBHTF9SRURfQklUUyAgICAgICAgICAgICAgICAgICAgICAgMHgwRDUyCisjZGVmaW5lIEdMX0dSRUVOX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTMKKyNkZWZpbmUgR0xfQkxVRV9CSVRTICAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NAorI2RlZmluZSBHTF9BTFBIQV9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDU1CisjZGVmaW5lIEdMX0RFUFRIX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTYKKyNkZWZpbmUgR0xfU1RFTkNJTF9CSVRTICAgICAgICAgICAgICAgICAgIDB4MEQ1NworI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9VTklUUyAgICAgICAgICAgMHgyQTAwCisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAweDgwMzcKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SICAgICAgICAgIDB4ODAzOAorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfMkQgICAgICAgICAgICAgMHg4MDY5CisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9TSVpFICAgICAgICAgICAgICAweDgwN0EKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1RZUEUgICAgICAgICAgICAgIDB4ODA3QgorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfU1RSSURFICAgICAgICAgICAgMHg4MDdDCisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9UWVBFICAgICAgICAgICAgICAweDgwN0UKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1NUUklERSAgICAgICAgICAgIDB4ODA3RgorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9TSVpFICAgICAgICAgICAgICAgMHg4MDgxCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAweDgwODIKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfU1RSSURFICAgICAgICAgICAgIDB4ODA4MworI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NJWkUgICAgICAgMHg4MDg4CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfVFlQRSAgICAgICAweDgwODkKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUgICAgIDB4ODA4QQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgMHg4MDhFCisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9QT0lOVEVSICAgICAgICAgICAweDgwOEYKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgIDB4ODA5MAorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVIgICAgMHg4MDkyCisjZGVmaW5lIEdMX1NBTVBMRV9CVUZGRVJTICAgICAgICAgICAgICAgICAweDgwQTgKKyNkZWZpbmUgR0xfU0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBBOQorI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0VfVkFMVUUgICAgICAgICAgMHg4MEFBCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQgICAgICAgICAweDgwQUIKKworLyogR2V0VGV4dHVyZVBhcmFtZXRlciAqLworLyogICAgICBHTF9URVhUVVJFX01BR19GSUxURVIgKi8KKy8qICAgICAgR0xfVEVYVFVSRV9NSU5fRklMVEVSICovCisvKiAgICAgIEdMX1RFWFRVUkVfV1JBUF9TICovCisvKiAgICAgIEdMX1RFWFRVUkVfV1JBUF9UICovCisKKyNkZWZpbmUgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIDB4ODZBMgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgMHg4NkEzCisKKy8qIEhpbnRNb2RlICovCisjZGVmaW5lIEdMX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAgICAgICAweDExMDAKKyNkZWZpbmUgR0xfRkFTVEVTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMQorI2RlZmluZSBHTF9OSUNFU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAyCisKKy8qIEhpbnRUYXJnZXQgKi8KKyNkZWZpbmUgR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5UICAgIDB4MEM1MAorI2RlZmluZSBHTF9QT0lOVF9TTU9PVEhfSElOVCAgICAgICAgICAgICAgMHgwQzUxCisjZGVmaW5lIEdMX0xJTkVfU01PT1RIX0hJTlQgICAgICAgICAgICAgICAweDBDNTIKKyNkZWZpbmUgR0xfRk9HX0hJTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MEM1NAorI2RlZmluZSBHTF9HRU5FUkFURV9NSVBNQVBfSElOVCAgICAgICAgICAgMHg4MTkyCisKKy8qIExpZ2h0TW9kZWxQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAgICAgICAgICAgIDB4MEI1MworI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAgICAgICAgICAgMHgwQjUyCisKKy8qIExpZ2h0UGFyYW1ldGVyICovCisjZGVmaW5lIEdMX0FNQklFTlQgICAgICAgICAgICAgICAgICAgICAgICAweDEyMDAKKyNkZWZpbmUgR0xfRElGRlVTRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMQorI2RlZmluZSBHTF9TUEVDVUxBUiAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAyCisjZGVmaW5lIEdMX1BPU0lUSU9OICAgICAgICAgICAgICAgICAgICAgICAweDEyMDMKKyNkZWZpbmUgR0xfU1BPVF9ESVJFQ1RJT04gICAgICAgICAgICAgICAgIDB4MTIwNAorI2RlZmluZSBHTF9TUE9UX0VYUE9ORU5UICAgICAgICAgICAgICAgICAgMHgxMjA1CisjZGVmaW5lIEdMX1NQT1RfQ1VUT0ZGICAgICAgICAgICAgICAgICAgICAweDEyMDYKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQVRURU5VQVRJT04gICAgICAgICAgIDB4MTIwNworI2RlZmluZSBHTF9MSU5FQVJfQVRURU5VQVRJT04gICAgICAgICAgICAgMHgxMjA4CisjZGVmaW5lIEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiAgICAgICAgICAweDEyMDkKKworLyogRGF0YVR5cGUgKi8KKyNkZWZpbmUgR0xfQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMAorI2RlZmluZSBHTF9VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgMHgxNDAxCisjZGVmaW5lIEdMX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDIKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgIDB4MTQwMworI2RlZmluZSBHTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDA2CisjZGVmaW5lIEdMX0ZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MEMKKworLyogTG9naWNPcCAqLworI2RlZmluZSBHTF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTAwCisjZGVmaW5lIEdMX0FORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDEKKyNkZWZpbmUgR0xfQU5EX1JFVkVSU0UgICAgICAgICAgICAgICAgICAgIDB4MTUwMgorI2RlZmluZSBHTF9DT1BZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTAzCisjZGVmaW5lIEdMX0FORF9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAweDE1MDQKKyNkZWZpbmUgR0xfTk9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwNQorI2RlZmluZSBHTF9YT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA2CisjZGVmaW5lIEdMX09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDcKKyNkZWZpbmUgR0xfTk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwOAorI2RlZmluZSBHTF9FUVVJViAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA5CisjZGVmaW5lIEdMX0lOVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEEKKyNkZWZpbmUgR0xfT1JfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgIDB4MTUwQgorI2RlZmluZSBHTF9DT1BZX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgMHgxNTBDCisjZGVmaW5lIEdMX09SX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgICAweDE1MEQKKyNkZWZpbmUgR0xfTkFORCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwRQorI2RlZmluZSBHTF9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBGCisKKy8qIE1hdGVyaWFsRmFjZSAqLworLyogICAgICBHTF9GUk9OVF9BTkRfQkFDSyAqLworCisvKiBNYXRlcmlhbFBhcmFtZXRlciAqLworI2RlZmluZSBHTF9FTUlTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgMHgxNjAwCisjZGVmaW5lIEdMX1NISU5JTkVTUyAgICAgICAgICAgICAgICAgICAgICAweDE2MDEKKyNkZWZpbmUgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSAgICAgICAgICAgIDB4MTYwMgorLyogICAgICBHTF9BTUJJRU5UICovCisvKiAgICAgIEdMX0RJRkZVU0UgKi8KKy8qICAgICAgR0xfU1BFQ1VMQVIgKi8KKworLyogTWF0cml4TW9kZSAqLworI2RlZmluZSBHTF9NT0RFTFZJRVcgICAgICAgICAgICAgICAgICAgICAgMHgxNzAwCisjZGVmaW5lIEdMX1BST0pFQ1RJT04gICAgICAgICAgICAgICAgICAgICAweDE3MDEKKyNkZWZpbmUgR0xfVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTcwMgorCisvKiBOb3JtYWxQb2ludGVyVHlwZSAqLworLyogICAgICBHTF9CWVRFICovCisvKiAgICAgIEdMX1NIT1JUICovCisvKiAgICAgIEdMX0ZMT0FUICovCisvKiAgICAgIEdMX0ZJWEVEICovCisKKy8qIFBpeGVsRm9ybWF0ICovCisjZGVmaW5lIEdMX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDYKKyNkZWZpbmUgR0xfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwNworI2RlZmluZSBHTF9SR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA4CisjZGVmaW5lIEdMX0xVTUlOQU5DRSAgICAgICAgICAgICAgICAgICAgICAweDE5MDkKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBICAgICAgICAgICAgICAgIDB4MTkwQQorCisvKiBQaXhlbFN0b3JlUGFyYW1ldGVyICovCisjZGVmaW5lIEdMX1VOUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAweDBDRjUKKyNkZWZpbmUgR0xfUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAgIDB4MEQwNQorCisvKiBQaXhlbFR5cGUgKi8KKy8qICAgICAgR0xfVU5TSUdORURfQllURSAqLworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICAgICAgICAgMHg4MDMzCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgICAgICAgICAweDgwMzQKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV82XzUgICAgICAgICAgIDB4ODM2MworCisvKiBTaGFkaW5nTW9kZWwgKi8KKyNkZWZpbmUgR0xfRkxBVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUQwMAorI2RlZmluZSBHTF9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgMHgxRDAxCisKKy8qIFN0ZW5jaWxGdW5jdGlvbiAqLworLyogICAgICBHTF9ORVZFUiAqLworLyogICAgICBHTF9MRVNTICovCisvKiAgICAgIEdMX0VRVUFMICovCisvKiAgICAgIEdMX0xFUVVBTCAqLworLyogICAgICBHTF9HUkVBVEVSICovCisvKiAgICAgIEdMX05PVEVRVUFMICovCisvKiAgICAgIEdMX0dFUVVBTCAqLworLyogICAgICBHTF9BTFdBWVMgKi8KKworLyogU3RlbmNpbE9wICovCisvKiAgICAgIEdMX1pFUk8gKi8KKyNkZWZpbmUgR0xfS0VFUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMAorI2RlZmluZSBHTF9SRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAxCisjZGVmaW5lIEdMX0lOQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDIKKyNkZWZpbmUgR0xfREVDUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMworLyogICAgICBHTF9JTlZFUlQgKi8KKworLyogU3RyaW5nTmFtZSAqLworI2RlZmluZSBHTF9WRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAwCisjZGVmaW5lIEdMX1JFTkRFUkVSICAgICAgICAgICAgICAgICAgICAgICAweDFGMDEKKyNkZWZpbmUgR0xfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMgorI2RlZmluZSBHTF9FWFRFTlNJT05TICAgICAgICAgICAgICAgICAgICAgMHgxRjAzCisKKy8qIFRleENvb3JkUG9pbnRlclR5cGUgKi8KKy8qICAgICAgR0xfU0hPUlQgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKy8qICAgICAgR0xfQllURSAqLworCisvKiBUZXh0dXJlRW52TW9kZSAqLworI2RlZmluZSBHTF9NT0RVTEFURSAgICAgICAgICAgICAgICAgICAgICAgMHgyMTAwCisjZGVmaW5lIEdMX0RFQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAweDIxMDEKKy8qICAgICAgR0xfQkxFTkQgKi8KKyNkZWZpbmUgR0xfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNAorLyogICAgICBHTF9SRVBMQUNFICovCisKKy8qIFRleHR1cmVFbnZQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRV9FTlZfTU9ERSAgICAgICAgICAgICAgIDB4MjIwMAorI2RlZmluZSBHTF9URVhUVVJFX0VOVl9DT0xPUiAgICAgICAgICAgICAgMHgyMjAxCisKKy8qIFRleHR1cmVFbnZUYXJnZXQgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRV9FTlYgICAgICAgICAgICAgICAgICAgIDB4MjMwMAorCisvKiBUZXh0dXJlTWFnRmlsdGVyICovCisjZGVmaW5lIEdMX05FQVJFU1QgICAgICAgICAgICAgICAgICAgICAgICAweDI2MDAKKyNkZWZpbmUgR0xfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjYwMQorCisvKiBUZXh0dXJlTWluRmlsdGVyICovCisvKiAgICAgIEdMX05FQVJFU1QgKi8KKy8qICAgICAgR0xfTElORUFSICovCisjZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgICAgICAgICAweDI3MDAKKyNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICAgICAgICAgIDB4MjcwMQorI2RlZmluZSBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgICAgICAgICAgMHgyNzAyCisjZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSICAgICAgICAgICAweDI3MDMKKworLyogVGV4dHVyZVBhcmFtZXRlck5hbWUgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRV9NQUdfRklMVEVSICAgICAgICAgICAgIDB4MjgwMAorI2RlZmluZSBHTF9URVhUVVJFX01JTl9GSUxURVIgICAgICAgICAgICAgMHgyODAxCisjZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9TICAgICAgICAgICAgICAgICAweDI4MDIKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1QgICAgICAgICAgICAgICAgIDB4MjgwMworI2RlZmluZSBHTF9HRU5FUkFURV9NSVBNQVAgICAgICAgICAgICAgICAgMHg4MTkxCisKKy8qIFRleHR1cmVUYXJnZXQgKi8KKy8qICAgICAgR0xfVEVYVFVSRV8yRCAqLworCisvKiBUZXh0dXJlVW5pdCAqLworI2RlZmluZSBHTF9URVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMwCisjZGVmaW5lIEdMX1RFWFRVUkUxICAgICAgICAgICAgICAgICAgICAgICAweDg0QzEKKyNkZWZpbmUgR0xfVEVYVFVSRTIgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMgorI2RlZmluZSBHTF9URVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMzCisjZGVmaW5lIEdMX1RFWFRVUkU0ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzQKKyNkZWZpbmUgR0xfVEVYVFVSRTUgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNQorI2RlZmluZSBHTF9URVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM2CisjZGVmaW5lIEdMX1RFWFRVUkU3ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzcKKyNkZWZpbmUgR0xfVEVYVFVSRTggICAgICAgICAgICAgICAgICAgICAgIDB4ODRDOAorI2RlZmluZSBHTF9URVhUVVJFOSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM5CisjZGVmaW5lIEdMX1RFWFRVUkUxMCAgICAgICAgICAgICAgICAgICAgICAweDg0Q0EKKyNkZWZpbmUgR0xfVEVYVFVSRTExICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQgorI2RlZmluZSBHTF9URVhUVVJFMTIgICAgICAgICAgICAgICAgICAgICAgMHg4NENDCisjZGVmaW5lIEdMX1RFWFRVUkUxMyAgICAgICAgICAgICAgICAgICAgICAweDg0Q0QKKyNkZWZpbmUgR0xfVEVYVFVSRTE0ICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRQorI2RlZmluZSBHTF9URVhUVVJFMTUgICAgICAgICAgICAgICAgICAgICAgMHg4NENGCisjZGVmaW5lIEdMX1RFWFRVUkUxNiAgICAgICAgICAgICAgICAgICAgICAweDg0RDAKKyNkZWZpbmUgR0xfVEVYVFVSRTE3ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMQorI2RlZmluZSBHTF9URVhUVVJFMTggICAgICAgICAgICAgICAgICAgICAgMHg4NEQyCisjZGVmaW5lIEdMX1RFWFRVUkUxOSAgICAgICAgICAgICAgICAgICAgICAweDg0RDMKKyNkZWZpbmUgR0xfVEVYVFVSRTIwICAgICAgICAgICAgICAgICAgICAgIDB4ODRENAorI2RlZmluZSBHTF9URVhUVVJFMjEgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ1CisjZGVmaW5lIEdMX1RFWFRVUkUyMiAgICAgICAgICAgICAgICAgICAgICAweDg0RDYKKyNkZWZpbmUgR0xfVEVYVFVSRTIzICAgICAgICAgICAgICAgICAgICAgIDB4ODRENworI2RlZmluZSBHTF9URVhUVVJFMjQgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ4CisjZGVmaW5lIEdMX1RFWFRVUkUyNSAgICAgICAgICAgICAgICAgICAgICAweDg0RDkKKyNkZWZpbmUgR0xfVEVYVFVSRTI2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQQorI2RlZmluZSBHTF9URVhUVVJFMjcgICAgICAgICAgICAgICAgICAgICAgMHg4NERCCisjZGVmaW5lIEdMX1RFWFRVUkUyOCAgICAgICAgICAgICAgICAgICAgICAweDg0REMKKyNkZWZpbmUgR0xfVEVYVFVSRTI5ICAgICAgICAgICAgICAgICAgICAgIDB4ODRERAorI2RlZmluZSBHTF9URVhUVVJFMzAgICAgICAgICAgICAgICAgICAgICAgMHg4NERFCisjZGVmaW5lIEdMX1RFWFRVUkUzMSAgICAgICAgICAgICAgICAgICAgICAweDg0REYKKyNkZWZpbmUgR0xfQUNUSVZFX1RFWFRVUkUgICAgICAgICAgICAgICAgIDB4ODRFMAorI2RlZmluZSBHTF9DTElFTlRfQUNUSVZFX1RFWFRVUkUgICAgICAgICAgMHg4NEUxCisKKy8qIFRleHR1cmVXcmFwTW9kZSAqLworI2RlZmluZSBHTF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgyOTAxCisjZGVmaW5lIEdMX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgICAgICAweDgxMkYKKworLyogVmVydGV4UG9pbnRlclR5cGUgKi8KKy8qICAgICAgR0xfU0hPUlQgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKy8qICAgICAgR0xfQllURSAqLworCisvKiBMaWdodE5hbWUgKi8KKyNkZWZpbmUgR0xfTElHSFQwICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBHTF9MSUdIVDEgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAxCisjZGVmaW5lIEdMX0xJR0hUMiAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDIKKyNkZWZpbmUgR0xfTElHSFQzICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMworI2RlZmluZSBHTF9MSUdIVDQgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA0CisjZGVmaW5lIEdMX0xJR0hUNSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDUKKyNkZWZpbmUgR0xfTElHSFQ2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNgorI2RlZmluZSBHTF9MSUdIVDcgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA3CisKKy8qIEJ1ZmZlciBPYmplY3RzICovCisjZGVmaW5lIEdMX0FSUkFZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAweDg4OTIKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIgICAgICAgICAgIDB4ODg5MworCisjZGVmaW5lIEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgICAgMHg4ODk0CisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgMHg4ODk1CisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgMHg4ODk2CisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgMHg4ODk3CisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgMHg4ODk4CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgMHg4ODlBCisKKyNkZWZpbmUgR0xfU1RBVElDX0RSQVcgICAgICAgICAgICAgICAgICAgIDB4ODhFNAorI2RlZmluZSBHTF9EWU5BTUlDX0RSQVcgICAgICAgICAgICAgICAgICAgMHg4OEU4CisKKyNkZWZpbmUgR0xfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgIDB4ODc2NAorI2RlZmluZSBHTF9CVUZGRVJfVVNBR0UgICAgICAgICAgICAgICAgICAgMHg4NzY1CisKKy8qIFRleHR1cmUgY29tYmluZSArIGRvdDMgKi8KKyNkZWZpbmUgR0xfU1VCVFJBQ1QgICAgICAgICAgICAgICAgICAgICAgIDB4ODRFNworI2RlZmluZSBHTF9DT01CSU5FICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTcwCisjZGVmaW5lIEdMX0NPTUJJTkVfUkdCICAgICAgICAgICAgICAgICAgICAweDg1NzEKKyNkZWZpbmUgR0xfQ09NQklORV9BTFBIQSAgICAgICAgICAgICAgICAgIDB4ODU3MgorI2RlZmluZSBHTF9SR0JfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMHg4NTczCisjZGVmaW5lIEdMX0FERF9TSUdORUQgICAgICAgICAgICAgICAgICAgICAweDg1NzQKKyNkZWZpbmUgR0xfSU5URVJQT0xBVEUgICAgICAgICAgICAgICAgICAgIDB4ODU3NQorI2RlZmluZSBHTF9DT05TVEFOVCAgICAgICAgICAgICAgICAgICAgICAgMHg4NTc2CisjZGVmaW5lIEdMX1BSSU1BUllfQ09MT1IgICAgICAgICAgICAgICAgICAweDg1NzcKKyNkZWZpbmUgR0xfUFJFVklPVVMgICAgICAgICAgICAgICAgICAgICAgIDB4ODU3OAorI2RlZmluZSBHTF9PUEVSQU5EMF9SR0IgICAgICAgICAgICAgICAgICAgMHg4NTkwCisjZGVmaW5lIEdMX09QRVJBTkQxX1JHQiAgICAgICAgICAgICAgICAgICAweDg1OTEKKyNkZWZpbmUgR0xfT1BFUkFORDJfUkdCICAgICAgICAgICAgICAgICAgIDB4ODU5MgorI2RlZmluZSBHTF9PUEVSQU5EMF9BTFBIQSAgICAgICAgICAgICAgICAgMHg4NTk4CisjZGVmaW5lIEdMX09QRVJBTkQxX0FMUEhBICAgICAgICAgICAgICAgICAweDg1OTkKKyNkZWZpbmUgR0xfT1BFUkFORDJfQUxQSEEgICAgICAgICAgICAgICAgIDB4ODU5QQorCisjZGVmaW5lIEdMX0FMUEhBX1NDQUxFICAgICAgICAgICAgICAgICAgICAweDBEMUMKKworI2RlZmluZSBHTF9TUkMwX1JHQiAgICAgICAgICAgICAgICAgICAgICAgMHg4NTgwCisjZGVmaW5lIEdMX1NSQzFfUkdCICAgICAgICAgICAgICAgICAgICAgICAweDg1ODEKKyNkZWZpbmUgR0xfU1JDMl9SR0IgICAgICAgICAgICAgICAgICAgICAgIDB4ODU4MgorI2RlZmluZSBHTF9TUkMwX0FMUEhBICAgICAgICAgICAgICAgICAgICAgMHg4NTg4CisjZGVmaW5lIEdMX1NSQzFfQUxQSEEgICAgICAgICAgICAgICAgICAgICAweDg1ODkKKyNkZWZpbmUgR0xfU1JDMl9BTFBIQSAgICAgICAgICAgICAgICAgICAgIDB4ODU4QQorCisjZGVmaW5lIEdMX0RPVDNfUkdCICAgICAgICAgICAgICAgICAgICAgICAweDg2QUUKKyNkZWZpbmUgR0xfRE9UM19SR0JBICAgICAgICAgICAgICAgICAgICAgIDB4ODZBRgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIHJlcXVpcmVkIE9FUyBleHRlbnNpb24gdG9rZW5zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIE9FU19yZWFkX2Zvcm1hdCAqLworI2lmbmRlZiBHTF9PRVNfcmVhZF9mb3JtYXQKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyAgICAgICAgICAgICAgICAgICAweDhCOUEKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTICAgICAgICAgICAgICAgICAweDhCOUIKKyNlbmRpZgorCisvKiBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlICovCisjaWZuZGVmIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTAKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCQThfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTEKKyNkZWZpbmUgR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTIKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCQTRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTMKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCNV9BMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTQKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTUKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCQThfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTYKKyNkZWZpbmUgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTcKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCQTRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTgKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCNV9BMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTkKKyNlbmRpZgorCisvKiBPRVNfcG9pbnRfc2l6ZV9hcnJheSAqLworI2lmbmRlZiBHTF9PRVNfcG9pbnRfc2l6ZV9hcnJheQorI2RlZmluZSBHTF9QT0lOVF9TSVpFX0FSUkFZX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5QworI2RlZmluZSBHTF9QT0lOVF9TSVpFX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk4QQorI2RlZmluZSBHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk4QgorI2RlZmluZSBHTF9QT0lOVF9TSVpFX0FSUkFZX1BPSU5URVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk4QworI2RlZmluZSBHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgIDB4OEI5RgorI2VuZGlmCisKKy8qIEdMX09FU19wb2ludF9zcHJpdGUgKi8KKyNpZm5kZWYgR0xfT0VTX3BvaW50X3Nwcml0ZQorI2RlZmluZSBHTF9QT0lOVF9TUFJJVEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg2MQorI2RlZmluZSBHTF9DT09SRF9SRVBMQUNFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg2MgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBdmFpbGFibGUgb25seSBpbiBDb21tb24gcHJvZmlsZSAqLworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xBbHBoYUZ1bmMgKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckNvbG9yIChHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyRGVwdGhmIChHTGNsYW1wZiBkZXB0aCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsaXBQbGFuZWYgKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb2xvcjRmIChHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVwdGhSYW5nZWYgKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRm9nZiAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRm9nZnYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRnJ1c3R1bWYgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRDbGlwUGxhbmVmIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgZXFuWzRdKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RmxvYXR2IChHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldExpZ2h0ZnYgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRNYXRlcmlhbGZ2IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhFbnZmdiAoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodE1vZGVsZiAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHRNb2RlbGZ2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0ZiAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodGZ2IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGluZVdpZHRoIChHTGZsb2F0IHdpZHRoKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTG9hZE1hdHJpeGYgKGNvbnN0IEdMZmxvYXQgKm0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRlcmlhbGYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRlcmlhbGZ2IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNdWx0TWF0cml4ZiAoY29uc3QgR0xmbG9hdCAqbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZiAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTm9ybWFsM2YgKEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xPcnRob2YgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmYgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZnYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRTaXplIChHTGZsb2F0IHNpemUpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0IChHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFJvdGF0ZWYgKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTY2FsZWYgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhFbnZmIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhFbnZmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJmIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUcmFuc2xhdGVmIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKKworLyogQXZhaWxhYmxlIGluIGJvdGggQ29tbW9uIGFuZCBDb21tb24tTGl0ZSBwcm9maWxlcyAqLworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEFscGhhRnVuY3ggKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kQnVmZmVyIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZFRleHR1cmUgKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQmxlbmRGdW5jIChHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCdWZmZXJEYXRhIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQnVmZmVyU3ViRGF0YSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyIChHTGJpdGZpZWxkIG1hc2spOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckNvbG9yeCAoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckRlcHRoeCAoR0xjbGFtcHggZGVwdGgpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhclN0ZW5jaWwgKEdMaW50IHMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGllbnRBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsaXBQbGFuZXggKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb2xvcjR1YiAoR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSwgR0x1Ynl0ZSBhbHBoYSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbG9yNHggKEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb2xvck1hc2sgKEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbG9yUG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvcHlUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDdWxsRmFjZSAoR0xlbnVtIG1vZGUpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVCdWZmZXJzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYnVmZmVycyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZVRleHR1cmVzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZXB0aEZ1bmMgKEdMZW51bSBmdW5jKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVwdGhNYXNrIChHTGJvb2xlYW4gZmxhZyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlcHRoUmFuZ2V4IChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERpc2FibGUgKEdMZW51bSBjYXApOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgKEdMZW51bSBhcnJheSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdBcnJheXMgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdFbGVtZW50cyAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFbmFibGUgKEdMZW51bSBjYXApOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFbmFibGVDbGllbnRTdGF0ZSAoR0xlbnVtIGFycmF5KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRmluaXNoICh2b2lkKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRmx1c2ggKHZvaWQpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGb2d4IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGb2d4diAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcm9udEZhY2UgKEdMZW51bSBtb2RlKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRnJ1c3R1bXggKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRCb29sZWFudiAoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEJ1ZmZlclBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRDbGlwUGxhbmV4IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgZXFuWzRdKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuQnVmZmVycyAoR0xzaXplaSBuLCBHTHVpbnQgKmJ1ZmZlcnMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5UZXh0dXJlcyAoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKTsKK0dMX0FQSSBHTGVudW0gR0xfQVBJRU5UUlkgZ2xHZXRFcnJvciAodm9pZCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEZpeGVkdiAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRJbnRlZ2VydiAoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0TGlnaHR4diAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldE1hdGVyaWFseHYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFBvaW50ZXJ2IChHTGVudW0gcG5hbWUsIHZvaWQgKipwYXJhbXMpOworR0xfQVBJIGNvbnN0IEdMdWJ5dGUgKiBHTF9BUElFTlRSWSBnbEdldFN0cmluZyAoR0xlbnVtIG5hbWUpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhFbnZpdiAoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4RW52eHYgKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4UGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleFBhcmFtZXRlcnh2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEhpbnQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKTsKK0dMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc0J1ZmZlciAoR0x1aW50IGJ1ZmZlcik7CitHTF9BUEkgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNFbmFibGVkIChHTGVudW0gY2FwKTsKK0dMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc1RleHR1cmUgKEdMdWludCB0ZXh0dXJlKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHRNb2RlbHggKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0TW9kZWx4diAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodHggKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHR4diAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpbmVXaWR0aHggKEdMZml4ZWQgd2lkdGgpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMb2FkSWRlbnRpdHkgKHZvaWQpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMb2FkTWF0cml4eCAoY29uc3QgR0xmaXhlZCAqbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExvZ2ljT3AgKEdMZW51bSBvcGNvZGUpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRlcmlhbHggKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRlcmlhbHh2IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRyaXhNb2RlIChHTGVudW0gbW9kZSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRNYXRyaXh4IChjb25zdCBHTGZpeGVkICptKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDR4IChHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xOb3JtYWwzeCAoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE5vcm1hbFBvaW50ZXIgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsT3J0aG94IChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUGl4ZWxTdG9yZWkgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcnggKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyeHYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRTaXpleCAoR0xmaXhlZCBzaXplKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9seWdvbk9mZnNldHggKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9wTWF0cml4ICh2b2lkKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUHVzaE1hdHJpeCAodm9pZCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFJlYWRQaXhlbHMgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xSb3RhdGV4IChHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2UgKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2V4IChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNjYWxleCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNjaXNzb3IgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU2hhZGVNb2RlbCAoR0xlbnVtIG1vZGUpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTdGVuY2lsRnVuYyAoR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTdGVuY2lsTWFzayAoR0x1aW50IG1hc2spOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTdGVuY2lsT3AgKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleENvb3JkUG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhFbnZpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4RW52eCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4RW52aXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudnh2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4UGFyYW1ldGVyaSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcnggKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJ4diAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRyYW5zbGF0ZXggKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhQb2ludGVyIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFZpZXdwb3J0IChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogUmVxdWlyZWQgT0VTIGV4dGVuc2lvbiBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfT0VTX3JlYWRfZm9ybWF0ICovCisjaWZuZGVmIEdMX09FU19yZWFkX2Zvcm1hdAorI2RlZmluZSBHTF9PRVNfcmVhZF9mb3JtYXQgMQorI2VuZGlmCisKKy8qIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUgKi8KKyNpZm5kZWYgR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZQorI2RlZmluZSBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlIDEKKyNlbmRpZgorCisvKiBHTF9PRVNfcG9pbnRfc2l6ZV9hcnJheSAqLworI2lmbmRlZiBHTF9PRVNfcG9pbnRfc2l6ZV9hcnJheQorI2RlZmluZSBHTF9PRVNfcG9pbnRfc2l6ZV9hcnJheSAxCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50U2l6ZVBvaW50ZXJPRVMgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgorCisvKiBHTF9PRVNfcG9pbnRfc3ByaXRlICovCisjaWZuZGVmIEdMX09FU19wb2ludF9zcHJpdGUKKyNkZWZpbmUgR0xfT0VTX3BvaW50X3Nwcml0ZSAxCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fZ2xfaF8gKi8KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2luY2x1ZGUvR0xFUy9nbGV4dC5oIGIvb3BlbmdsL2luY2x1ZGUvR0xFUy9nbGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMDE4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvaW5jbHVkZS9HTEVTL2dsZXh0LmgKQEAgLTAsMCArMSw2MjIgQEAKKyNpZm5kZWYgX19nbGV4dF9oXworI2RlZmluZSBfX2dsZXh0X2hfCisKKy8qICRSZXZpc2lvbjogNzE3MiAkIG9uICREYXRlOjogMjAwOS0wMS0wOSAxMToxNzo0MSAtMDgwMCAjJCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBUaGlzIGRvY3VtZW50IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTR0kgRnJlZSBTb2Z0d2FyZSBCIExpY2Vuc2UgVmVyc2lvbgorICogMi4wLiBGb3IgZGV0YWlscywgc2VlIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQi8gLgorICovCisKKyNpZm5kZWYgR0xfQVBJRU5UUllQCisjICAgZGVmaW5lIEdMX0FQSUVOVFJZUCBHTF9BUElFTlRSWSoKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIE9FUyBleHRlbnNpb24gdG9rZW5zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdMX09FU19ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZSAqLworI2lmbmRlZiBHTF9PRVNfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUKKy8qIEJMRU5EX0VRVUFUSU9OX1JHQl9PRVMgc2FtZSBhcyBCTEVORF9FUVVBVElPTl9PRVMgKi8KKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fUkdCX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDkKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fQUxQSEFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4M0QKKyNlbmRpZgorCisvKiBHTF9PRVNfYmxlbmRfZnVuY19zZXBhcmF0ZSAqLworI2lmbmRlZiBHTF9PRVNfYmxlbmRfZnVuY19zZXBhcmF0ZQorI2RlZmluZSBHTF9CTEVORF9EU1RfUkdCX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBDOAorI2RlZmluZSBHTF9CTEVORF9TUkNfUkdCX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBDOQorI2RlZmluZSBHTF9CTEVORF9EU1RfQUxQSEFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBDQQorI2RlZmluZSBHTF9CTEVORF9TUkNfQUxQSEFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBDQgorI2VuZGlmCisKKy8qIEdMX09FU19ibGVuZF9zdWJ0cmFjdCAqLworI2lmbmRlZiBHTF9PRVNfYmxlbmRfc3VidHJhY3QKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDkKKyNkZWZpbmUgR0xfRlVOQ19BRERfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDYKKyNkZWZpbmUgR0xfRlVOQ19TVUJUUkFDVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMEEKKyNkZWZpbmUgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMEIKKyNlbmRpZgorCisvKiBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZSAqLworI2lmbmRlZiBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZQorI2RlZmluZSBHTF9FVEMxX1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2NAorI2VuZGlmCisKKy8qIEdMX09FU19kZXB0aDI0ICovCisjaWZuZGVmIEdMX09FU19kZXB0aDI0CisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDI0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MUE2CisjZW5kaWYKKworLyogR0xfT0VTX2RlcHRoMzIgKi8KKyNpZm5kZWYgR0xfT0VTX2RlcHRoMzIKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMzJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgxQTcKKyNlbmRpZgorCisvKiBHTF9PRVNfZHJhd190ZXh0dXJlICovCisjaWZuZGVmIEdMX09FU19kcmF3X3RleHR1cmUKKyNkZWZpbmUgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOUQKKyNlbmRpZgorCisvKiBHTF9PRVNfRUdMX2ltYWdlICovCisjaWZuZGVmIEdMX09FU19FR0xfaW1hZ2UKK3R5cGVkZWYgdm9pZCogR0xlZ2xJbWFnZU9FUzsKKyNlbmRpZgorCisvKiBHTF9PRVNfZml4ZWRfcG9pbnQgKi8KKyNpZm5kZWYgR0xfT0VTX2ZpeGVkX3BvaW50CisjZGVmaW5lIEdMX0ZJWEVEX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDBDCisjZW5kaWYKKworLyogR0xfT0VTX2ZyYW1lYnVmZmVyX29iamVjdCAqLworI2lmbmRlZiBHTF9PRVNfZnJhbWVidWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX05PTkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0MAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0MQorI2RlZmluZSBHTF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1NgorI2RlZmluZSBHTF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1NworI2RlZmluZSBHTF9SR0I1NjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2MgorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQxNl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODFBNQorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfV0lEVEhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0MgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfSEVJR0hUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0MworI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUX09FUyAgICAgICAgICAgICAgICAgICAgIDB4OEQ0NAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1MAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1MQorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1MgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1MworI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1NAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1NQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFX09FUyAgICAgICAgICAgICAgIDB4OENEMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FX09FUyAgICAgICAgICAgICAgIDB4OENEMQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUxfT0VTICAgICAgICAgICAgIDB4OENEMgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRV9PRVMgICAgIDB4OENEMworI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENFMAorI2RlZmluZSBHTF9ERVBUSF9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQwMAorI2RlZmluZSBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQyMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENENQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlRfT0VTICAgICAgICAgICAgICAgIDB4OENENgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVF9PRVMgICAgICAgIDB4OENENworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNfT0VTICAgICAgICAgICAgICAgIDB4OENEOQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0ZPUk1BVFNfT0VTICAgICAgICAgICAgICAgICAgIDB4OENEQQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENERAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENBNgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQklORElOR19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENBNworI2RlZmluZSBHTF9NQVhfUkVOREVSQlVGRkVSX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRFOAorI2RlZmluZSBHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTl9PRVMgICAgICAgICAgICAgICAgICAgIDB4MDUwNgorI2VuZGlmCisKKy8qIEdMX09FU19tYXBidWZmZXIgKi8KKyNpZm5kZWYgR0xfT0VTX21hcGJ1ZmZlcgorI2RlZmluZSBHTF9XUklURV9PTkxZX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCOQorI2RlZmluZSBHTF9CVUZGRVJfQUNDRVNTX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCQgorI2RlZmluZSBHTF9CVUZGRVJfTUFQUEVEX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCQworI2RlZmluZSBHTF9CVUZGRVJfTUFQX1BPSU5URVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCRAorI2VuZGlmCisKKy8qIEdMX09FU19tYXRyaXhfZ2V0ICovCisjaWZuZGVmIEdMX09FU19tYXRyaXhfZ2V0CisjZGVmaW5lIEdMX01PREVMVklFV19NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTICAgICAgICAgICAgICAgMHg4OThECisjZGVmaW5lIEdMX1BST0pFQ1RJT05fTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyAgICAgICAgICAgICAgMHg4OThFCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyAgICAgICAgICAgICAgICAgMHg4OThGCisjZW5kaWYKKworLyogR0xfT0VTX21hdHJpeF9wYWxldHRlICovCisjaWZuZGVmIEdMX09FU19tYXRyaXhfcGFsZXR0ZQorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1VOSVRTX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBNAorI2RlZmluZSBHTF9NQVhfUEFMRVRURV9NQVRSSUNFU19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0MgorI2RlZmluZSBHTF9NQVRSSVhfUEFMRVRURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0MAorI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0NAorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBRAorI2RlZmluZSBHTF9DVVJSRU5UX1BBTEVUVEVfTUFUUklYX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0MworI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0NgorI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0NworI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU1RSSURFX09FUyAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0OAorI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0OQorI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgIDB4OEI5RQorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBQgorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBOQorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfU1RSSURFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBQQorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBQworI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgICAgICAgIDB4ODg5RQorI2VuZGlmCisKKy8qIEdMX09FU19wYWNrZWRfZGVwdGhfc3RlbmNpbCAqLworI2lmbmRlZiBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwKKyNkZWZpbmUgR0xfREVQVEhfU1RFTkNJTF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RjkKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzI0XzhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RkEKKyNkZWZpbmUgR0xfREVQVEgyNF9TVEVOQ0lMOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4RjAKKyNlbmRpZgorCisvKiBHTF9PRVNfcmdiOF9yZ2JhOCAqLworI2lmbmRlZiBHTF9PRVNfcmdiOF9yZ2JhOAorI2RlZmluZSBHTF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1MQorI2RlZmluZSBHTF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1OAorI2VuZGlmCisKKy8qIEdMX09FU19zdGVuY2lsMSAqLworI2lmbmRlZiBHTF9PRVNfc3RlbmNpbDEKKyNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENDYKKyNlbmRpZgorCisvKiBHTF9PRVNfc3RlbmNpbDQgKi8KKyNpZm5kZWYgR0xfT0VTX3N0ZW5jaWw0CisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVg0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDQ3CisjZW5kaWYKKworLyogR0xfT0VTX3N0ZW5jaWw4ICovCisjaWZuZGVmIEdMX09FU19zdGVuY2lsOAorI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0OAorI2VuZGlmCisKKy8qIEdMX09FU19zdGVuY2lsX3dyYXAgKi8KKyNpZm5kZWYgR0xfT0VTX3N0ZW5jaWxfd3JhcAorI2RlZmluZSBHTF9JTkNSX1dSQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUwNworI2RlZmluZSBHTF9ERUNSX1dSQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUwOAorI2VuZGlmCisKKy8qIEdMX09FU190ZXh0dXJlX2N1YmVfbWFwICovCisjaWZuZGVmIEdMX09FU190ZXh0dXJlX2N1YmVfbWFwCisjZGVmaW5lIEdMX05PUk1BTF9NQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTExCisjZGVmaW5lIEdMX1JFRkxFQ1RJT05fTUFQX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTEyCisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTEzCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTE0CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWF9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTE1CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWF9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTE2CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWV9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTE3CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWV9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTE4CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWl9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTE5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWl9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTFBCisjZGVmaW5lIEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTFDCisjZGVmaW5lIEdMX1RFWFRVUkVfR0VOX01PREVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNTAwCisjZGVmaW5lIEdMX1RFWFRVUkVfR0VOX1NUUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDYwCisjZW5kaWYKKworLyogR0xfT0VTX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0ICovCisjaWZuZGVmIEdMX09FU190ZXh0dXJlX21pcnJvcmVkX3JlcGVhdAorI2RlZmluZSBHTF9NSVJST1JFRF9SRVBFQVRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODM3MAorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogQU1EIGV4dGVuc2lvbiB0b2tlbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUgKi8KKyNpZm5kZWYgR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUKKyNkZWZpbmUgR0xfM0RDX1hfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3RjkKKyNkZWZpbmUgR0xfM0RDX1hZX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3RkEKKyNlbmRpZgorCisvKiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZSAqLworI2lmbmRlZiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZQorI2RlZmluZSBHTF9BVENfUkdCX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEM5MgorI2RlZmluZSBHTF9BVENfUkdCQV9FWFBMSUNJVF9BTFBIQV9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEM5MworI2RlZmluZSBHTF9BVENfUkdCQV9JTlRFUlBPTEFURURfQUxQSEFfQU1EICAgICAgICAgICAgICAgICAgICAgIDB4ODdFRQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogRVhUIGV4dGVuc2lvbiB0b2tlbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljICovCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYworI2RlZmluZSBHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGRQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGRgorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogT0VTIGV4dGVuc2lvbiBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfT0VTX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlICovCisjaWZuZGVmIEdMX09FU19ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZQorI2RlZmluZSBHTF9PRVNfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQkxFTkRFUVVBVElPTlNFUEFSQVRFT0VTUFJPQykgKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKTsKKyNlbmRpZgorCisvKiBHTF9PRVNfYmxlbmRfZnVuY19zZXBhcmF0ZSAqLworI2lmbmRlZiBHTF9PRVNfYmxlbmRfZnVuY19zZXBhcmF0ZQorI2RlZmluZSBHTF9PRVNfYmxlbmRfZnVuY19zZXBhcmF0ZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEZ1bmNTZXBhcmF0ZU9FUyAoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpOworI2VuZGlmCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEJMRU5ERlVOQ1NFUEFSQVRFT0VTUFJPQykgKEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKTsKKyNlbmRpZgorCisvKiBHTF9PRVNfYmxlbmRfc3VidHJhY3QgKi8KKyNpZm5kZWYgR0xfT0VTX2JsZW5kX3N1YnRyYWN0CisjZGVmaW5lIEdMX09FU19ibGVuZF9zdWJ0cmFjdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uT0VTIChHTGVudW0gbW9kZSk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQkxFTkRFUVVBVElPTk9FU1BST0MpIChHTGVudW0gbW9kZSk7CisjZW5kaWYKKworLyogR0xfT0VTX2J5dGVfY29vcmRpbmF0ZXMgKi8KKyNpZm5kZWYgR0xfT0VTX2J5dGVfY29vcmRpbmF0ZXMKKyNkZWZpbmUgR0xfT0VTX2J5dGVfY29vcmRpbmF0ZXMgMQorI2VuZGlmCisKKy8qIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlICovCisjaWZuZGVmIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlCisjZGVmaW5lIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlIDEKKyNlbmRpZgorCisvKiBHTF9PRVNfZGVwdGgyNCAqLworI2lmbmRlZiBHTF9PRVNfZGVwdGgyNAorI2RlZmluZSBHTF9PRVNfZGVwdGgyNCAxCisjZW5kaWYKKworLyogR0xfT0VTX2RlcHRoMzIgKi8KKyNpZm5kZWYgR0xfT0VTX2RlcHRoMzIKKyNkZWZpbmUgR0xfT0VTX2RlcHRoMzIgMQorI2VuZGlmCisKKy8qIEdMX09FU19kcmF3X3RleHR1cmUgKi8KKyNpZm5kZWYgR0xfT0VTX2RyYXdfdGV4dHVyZQorI2RlZmluZSBHTF9PRVNfZHJhd190ZXh0dXJlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXhzT0VTIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHdpZHRoLCBHTHNob3J0IGhlaWdodCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXhpT0VTIChHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd1RleHhPRVMgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgd2lkdGgsIEdMZml4ZWQgaGVpZ2h0KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd1RleHN2T0VTIChjb25zdCBHTHNob3J0ICpjb29yZHMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3VGV4aXZPRVMgKGNvbnN0IEdMaW50ICpjb29yZHMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3VGV4eHZPRVMgKGNvbnN0IEdMZml4ZWQgKmNvb3Jkcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXhmT0VTIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHdpZHRoLCBHTGZsb2F0IGhlaWdodCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXhmdk9FUyAoY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXVEVYU09FU1BST0MpIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHdpZHRoLCBHTHNob3J0IGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdURVhJT0VTUFJPQykgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXVEVYWE9FU1BST0MpIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6LCBHTGZpeGVkIHdpZHRoLCBHTGZpeGVkIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdURVhTVk9FU1BST0MpIChjb25zdCBHTHNob3J0ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXVEVYSVZPRVNQUk9DKSAoY29uc3QgR0xpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdURVhYVk9FU1BST0MpIChjb25zdCBHTGZpeGVkICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXVEVYRk9FU1BST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHdpZHRoLCBHTGZsb2F0IGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdURVhGVk9FU1BST0MpIChjb25zdCBHTGZsb2F0ICpjb29yZHMpOworI2VuZGlmCisKKy8qIEdMX09FU19FR0xfaW1hZ2UgKi8KKyNpZm5kZWYgR0xfT0VTX0VHTF9pbWFnZQorI2RlZmluZSBHTF9PRVNfRUdMX2ltYWdlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFR0xJTUFHRVRBUkdFVFRFWFRVUkUyRE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRUdMSU1BR0VUQVJHRVRSRU5ERVJCVUZGRVJTVE9SQUdFT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpOworI2VuZGlmCisKKy8qIEdMX09FU19lbGVtZW50X2luZGV4X3VpbnQgKi8KKyNpZm5kZWYgR0xfT0VTX2VsZW1lbnRfaW5kZXhfdWludAorI2RlZmluZSBHTF9PRVNfZWxlbWVudF9pbmRleF91aW50IDEKKyNlbmRpZgorCisvKiBHTF9PRVNfZXh0ZW5kZWRfbWF0cml4X3BhbGV0dGUgKi8KKyNpZm5kZWYgR0xfT0VTX2V4dGVuZGVkX21hdHJpeF9wYWxldHRlCisjZGVmaW5lIEdMX09FU19leHRlbmRlZF9tYXRyaXhfcGFsZXR0ZSAxCisjZW5kaWYKKworLyogR0xfT0VTX2Zib19yZW5kZXJfbWlwbWFwICovCisjaWZuZGVmIEdMX09FU19mYm9fcmVuZGVyX21pcG1hcAorI2RlZmluZSBHTF9PRVNfZmJvX3JlbmRlcl9taXBtYXAgMQorI2VuZGlmCisKKy8qIEdMX09FU19maXhlZF9wb2ludCAqLworI2lmbmRlZiBHTF9PRVNfZml4ZWRfcG9pbnQKKyNkZWZpbmUgR0xfT0VTX2ZpeGVkX3BvaW50IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEFscGhhRnVuY3hPRVMgKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckNvbG9yeE9FUyAoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckRlcHRoeE9FUyAoR0xjbGFtcHggZGVwdGgpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGlwUGxhbmV4T0VTIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ29sb3I0eE9FUyAoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlcHRoUmFuZ2V4T0VTIChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZvZ3hPRVMgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZvZ3h2T0VTIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZydXN0dW14T0VTIChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0Q2xpcFBsYW5leE9FUyAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEZpeGVkdk9FUyAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRMaWdodHh2T0VTIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0TWF0ZXJpYWx4dk9FUyAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4RW52eHZPRVMgKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4UGFyYW1ldGVyeHZPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHRNb2RlbHhPRVMgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0TW9kZWx4dk9FUyAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodHhPRVMgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHR4dk9FUyAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpbmVXaWR0aHhPRVMgKEdMZml4ZWQgd2lkdGgpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMb2FkTWF0cml4eE9FUyAoY29uc3QgR0xmaXhlZCAqbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE1hdGVyaWFseE9FUyAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE1hdGVyaWFseHZPRVMgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRNYXRyaXh4T0VTIChjb25zdCBHTGZpeGVkICptKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDR4T0VTIChHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xOb3JtYWwzeE9FUyAoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE9ydGhveE9FUyAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyeE9FUyAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJ4dk9FUyAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFNpemV4T0VTIChHTGZpeGVkIHNpemUpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0eE9FUyAoR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xSb3RhdGV4T0VTIChHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2V4T0VTIChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNjYWxleE9FUyAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudnhPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudnh2T0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcnhPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcnh2T0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRyYW5zbGF0ZXhPRVMgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOworI2VuZGlmCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEFMUEhBRlVOQ1hPRVNQUk9DKSAoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZik7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENMRUFSQ09MT1JYT0VTUFJPQykgKEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ0xFQVJERVBUSFhPRVNQUk9DKSAoR0xjbGFtcHggZGVwdGgpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDTElQUExBTkVYT0VTUFJPQykgKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDT0xPUjRYT0VTUFJPQykgKEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xERVBUSFJBTkdFWE9FU1BST0MpIChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcik7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZPR1hPRVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRk9HWFZPRVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xGUlVTVFVNWE9FU1BST0MpIChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUQ0xJUFBMQU5FWE9FU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgZXFuWzRdKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VURklYRURWT0VTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUTElHSFRYVk9FU1BST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUTUFURVJJQUxYVk9FU1BST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRURVhFTlZYVk9FU1BST0MpIChHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFRFWFBBUkFNRVRFUlhWT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTElHSFRNT0RFTFhPRVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTElHSFRNT0RFTFhWT0VTUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTElHSFRYT0VTUFJPQykgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTElHSFRYVk9FU1BST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTElORVdJRFRIWE9FU1BST0MpIChHTGZpeGVkIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTE9BRE1BVFJJWFhPRVNQUk9DKSAoY29uc3QgR0xmaXhlZCAqbSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE1BVEVSSUFMWE9FU1BST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTUFURVJJQUxYVk9FU1BST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xNVUxUTUFUUklYWE9FU1BST0MpIChjb25zdCBHTGZpeGVkICptKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRYT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE5PUk1BTDNYT0VTUFJPQykgKEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xPUlRIT1hPRVNQUk9DKSAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSWE9FU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUlhWT0VTUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUE9JTlRTSVpFWE9FU1BST0MpIChHTGZpeGVkIHNpemUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQT0xZR09OT0ZGU0VUWE9FU1BST0MpIChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJPVEFURVhPRVNQUk9DKSAoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFNBTVBMRUNPVkVSQUdFWE9FU1BST0MpIChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFNDQUxFWE9FU1BST0MpIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYRU5WWE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhFTlZYVk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWFBBUkFNRVRFUlhPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYUEFSQU1FVEVSWFZPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xUUkFOU0xBVEVYT0VTUFJPQykgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOworI2VuZGlmCisKKy8qIEdMX09FU19mcmFtZWJ1ZmZlcl9vYmplY3QgKi8KKyNpZm5kZWYgR0xfT0VTX2ZyYW1lYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9PRVNfZnJhbWVidWZmZXJfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNSZW5kZXJidWZmZXJPRVMgKEdMdWludCByZW5kZXJidWZmZXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kUmVuZGVyYnVmZmVyT0VTIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5SZW5kZXJidWZmZXJzT0VTIChHTHNpemVpIG4sIEdMdWludCogcmVuZGVyYnVmZmVycyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKK0dMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc0ZyYW1lYnVmZmVyT0VTIChHTHVpbnQgZnJhbWVidWZmZXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kRnJhbWVidWZmZXJPRVMgKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZUZyYW1lYnVmZmVyc09FUyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGZyYW1lYnVmZmVycyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdlbkZyYW1lYnVmZmVyc09FUyAoR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycyk7CitHTF9BUEkgR0xlbnVtIEdMX0FQSUVOVFJZIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUyAoR0xlbnVtIHRhcmdldCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5lcmF0ZU1pcG1hcE9FUyAoR0xlbnVtIHRhcmdldCk7CisjZW5kaWYKK3R5cGVkZWYgR0xib29sZWFuIChHTF9BUElFTlRSWVAgUEZOR0xJU1JFTkRFUkJVRkZFUk9FU1BST0MpIChHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQklORFJFTkRFUkJVRkZFUk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFUkVOREVSQlVGRkVSU09FU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFTlJFTkRFUkJVRkZFUlNPRVNQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRSRU5ERVJCVUZGRVJQQVJBTUVURVJJVk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTElTRlJBTUVCVUZGRVJPRVNQUk9DKSAoR0x1aW50IGZyYW1lYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQklOREZSQU1FQlVGRkVST0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERFTEVURUZSQU1FQlVGRkVSU09FU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VORlJBTUVCVUZGRVJTT0VTUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpOwordHlwZWRlZiBHTGVudW0gKEdMX0FQSUVOVFJZUCBQRk5HTENIRUNLRlJBTUVCVUZGRVJTVEFUVVNPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSUkVOREVSQlVGRkVST0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFMkRPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVEZSQU1FQlVGRkVSQVRUQUNITUVOVFBBUkFNRVRFUklWT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRU5FUkFURU1JUE1BUE9FU1BST0MpIChHTGVudW0gdGFyZ2V0KTsKKyNlbmRpZgorCisvKiBHTF9PRVNfbWFwYnVmZmVyICovCisjaWZuZGVmIEdMX09FU19tYXBidWZmZXIKKyNkZWZpbmUgR0xfT0VTX21hcGJ1ZmZlciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJIHZvaWQqIEdMX0FQSUVOVFJZIGdsTWFwQnVmZmVyT0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKTsKK0dMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xVbm1hcEJ1ZmZlck9FUyAoR0xlbnVtIHRhcmdldCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEJ1ZmZlclBvaW50ZXJ2T0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIHZvaWQqKiBwYXJhbXMpOworI2VuZGlmCit0eXBlZGVmIHZvaWQqIChHTF9BUElFTlRSWVAgUEZOR0xNQVBCVUZGRVJPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2Vzcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMVU5NQVBCVUZGRVJPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVEJVRkZFUlBPSU5URVJWT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgdm9pZCoqIHBhcmFtcyk7CisjZW5kaWYKKworLyogR0xfT0VTX21hdHJpeF9nZXQgKi8KKyNpZm5kZWYgR0xfT0VTX21hdHJpeF9nZXQKKyNkZWZpbmUgR0xfT0VTX21hdHJpeF9nZXQgMQorI2VuZGlmCisKKy8qIEdMX09FU19tYXRyaXhfcGFsZXR0ZSAqLworI2lmbmRlZiBHTF9PRVNfbWF0cml4X3BhbGV0dGUKKyNkZWZpbmUgR0xfT0VTX21hdHJpeF9wYWxldHRlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTIChHTHVpbnQgbWF0cml4cGFsZXR0ZWluZGV4KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTICh2b2lkKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFdlaWdodFBvaW50ZXJPRVMgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDVVJSRU5UUEFMRVRURU1BVFJJWE9FU1BST0MpIChHTHVpbnQgbWF0cml4cGFsZXR0ZWluZGV4KTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTE9BRFBBTEVUVEVGUk9NTU9ERUxWSUVXTUFUUklYT0VTUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xNQVRSSVhJTkRFWFBPSU5URVJPRVNQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xXRUlHSFRQT0lOVEVST0VTUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgorCisvKiBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwgKi8KKyNpZm5kZWYgR0xfT0VTX3BhY2tlZF9kZXB0aF9zdGVuY2lsCisjZGVmaW5lIEdMX09FU19wYWNrZWRfZGVwdGhfc3RlbmNpbCAxCisjZW5kaWYKKworLyogR0xfT0VTX3F1ZXJ5X21hdHJpeCAqLworI2lmbmRlZiBHTF9PRVNfcXVlcnlfbWF0cml4CisjZGVmaW5lIEdMX09FU19xdWVyeV9tYXRyaXggMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSSBHTGJpdGZpZWxkIEdMX0FQSUVOVFJZIGdsUXVlcnlNYXRyaXh4T0VTIChHTGZpeGVkIG1hbnRpc3NhWzE2XSwgR0xpbnQgZXhwb25lbnRbMTZdKTsKKyNlbmRpZgordHlwZWRlZiBHTGJpdGZpZWxkIChHTF9BUElFTlRSWVAgUEZOR0xRVUVSWU1BVFJJWFhPRVNQUk9DKSAoR0xmaXhlZCBtYW50aXNzYVsxNl0sIEdMaW50IGV4cG9uZW50WzE2XSk7CisjZW5kaWYKKworLyogR0xfT0VTX3JnYjhfcmdiYTggKi8KKyNpZm5kZWYgR0xfT0VTX3JnYjhfcmdiYTgKKyNkZWZpbmUgR0xfT0VTX3JnYjhfcmdiYTggMQorI2VuZGlmCisKKy8qIEdMX09FU19zaW5nbGVfcHJlY2lzaW9uICovCisjaWZuZGVmIEdMX09FU19zaW5nbGVfcHJlY2lzaW9uCisjZGVmaW5lIEdMX09FU19zaW5nbGVfcHJlY2lzaW9uIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlcHRoUmFuZ2VmT0VTIChHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZydXN0dW1mT0VTIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsT3J0aG9mT0VTIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xpcFBsYW5lZk9FUyAoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldENsaXBQbGFuZWZPRVMgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckRlcHRoZk9FUyAoR0xjbGFtcGYgZGVwdGgpOworI2VuZGlmCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERFUFRIUkFOR0VGT0VTUFJPQykgKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRlJVU1RVTUZPRVNQUk9DKSAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE9SVEhPRk9FU1BST0MpIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ0xJUFBMQU5FRk9FU1BST0MpIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUQ0xJUFBMQU5FRk9FU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgZXFuWzRdKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ0xFQVJERVBUSEZPRVNQUk9DKSAoR0xjbGFtcGYgZGVwdGgpOworI2VuZGlmCisKKy8qIEdMX09FU19zdGVuY2lsMSAqLworI2lmbmRlZiBHTF9PRVNfc3RlbmNpbDEKKyNkZWZpbmUgR0xfT0VTX3N0ZW5jaWwxIDEKKyNlbmRpZgorCisvKiBHTF9PRVNfc3RlbmNpbDQgKi8KKyNpZm5kZWYgR0xfT0VTX3N0ZW5jaWw0CisjZGVmaW5lIEdMX09FU19zdGVuY2lsNCAxCisjZW5kaWYKKworLyogR0xfT0VTX3N0ZW5jaWw4ICovCisjaWZuZGVmIEdMX09FU19zdGVuY2lsOAorI2RlZmluZSBHTF9PRVNfc3RlbmNpbDggMQorI2VuZGlmCisKKy8qIEdMX09FU19zdGVuY2lsX3dyYXAgKi8KKyNpZm5kZWYgR0xfT0VTX3N0ZW5jaWxfd3JhcAorI2RlZmluZSBHTF9PRVNfc3RlbmNpbF93cmFwIDEKKyNlbmRpZgorCisvKiBHTF9PRVNfdGV4dHVyZV9jdWJlX21hcCAqLworI2lmbmRlZiBHTF9PRVNfdGV4dHVyZV9jdWJlX21hcAorI2RlZmluZSBHTF9PRVNfdGV4dHVyZV9jdWJlX21hcCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhHZW5mT0VTIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEdlbmZ2T0VTIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4R2VuaU9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4R2VuaXZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4R2VueE9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhHZW54dk9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleEdlbmZ2T0VTIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4R2VuaXZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4R2VueHZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOworI2VuZGlmCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWEdFTkZPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhHRU5GVk9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYR0VOSU9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhHRU5JVk9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWEdFTlhPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhHRU5YVk9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUVEVYR0VORlZPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFRFWEdFTklWT0VTUFJPQykgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUVEVYR0VOWFZPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7CisjZW5kaWYKKworLyogR0xfT0VTX3RleHR1cmVfZW52X2Nyb3NzYmFyICovCisjaWZuZGVmIEdMX09FU190ZXh0dXJlX2Vudl9jcm9zc2JhcgorI2RlZmluZSBHTF9PRVNfdGV4dHVyZV9lbnZfY3Jvc3NiYXIgMQorI2VuZGlmCisKKy8qIEdMX09FU190ZXh0dXJlX21pcnJvcmVkX3JlcGVhdCAqLworI2lmbmRlZiBHTF9PRVNfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQKKyNkZWZpbmUgR0xfT0VTX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0IDEKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIEFNRCBleHRlbnNpb24gZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdMX0FNRF9jb21wcmVzc2VkXzNEQ190ZXh0dXJlICovCisjaWZuZGVmIEdMX0FNRF9jb21wcmVzc2VkXzNEQ190ZXh0dXJlCisjZGVmaW5lIEdMX0FNRF9jb21wcmVzc2VkXzNEQ190ZXh0dXJlIDEKKyNlbmRpZgorCisvKiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZSAqLworI2lmbmRlZiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZQorI2RlZmluZSBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZSAxCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBFWFQgZXh0ZW5zaW9uIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMgKi8KKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyAxCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBkYWx2aWsgZXh0ZW5zaW9uIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEFORFJPSUQKK3ZvaWQgZ2xDb2xvclBvaW50ZXJCb3VuZHMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLAorICAgICAgICBjb25zdCBHTHZvaWQgKnB0ciwgR0xzaXplaSBjb3VudCk7Cit2b2lkIGdsTm9ybWFsUG9pbnRlckJvdW5kcyhHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsCisgICAgICAgIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCk7Cit2b2lkIGdsVGV4Q29vcmRQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAorICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKK3ZvaWQgZ2xWZXJ0ZXhQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAorICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKKyNlbmRpZgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX2dsZXh0X2hfICovCisKZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0dMRVMvZ2xwbGF0Zm9ybS5oIGIvb3BlbmdsL2luY2x1ZGUvR0xFUy9nbHBsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyNGNhZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9pbmNsdWRlL0dMRVMvZ2xwbGF0Zm9ybS5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZm5kZWYgX19nbHBsYXRmb3JtX2hfCisjZGVmaW5lIF9fZ2xwbGF0Zm9ybV9oXworCisvKiAkUmV2aXNpb246IDcxNzIgJCBvbiAkRGF0ZTo6IDIwMDktMDEtMDkgMTE6MTc6NDEgLTA4MDAgIyQgKi8KKworLyoKKyAqIFRoaXMgZG9jdW1lbnQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNHSSBGcmVlIFNvZnR3YXJlIEIgTGljZW5zZSBWZXJzaW9uCisgKiAyLjAuIEZvciBkZXRhaWxzLCBzZWUgaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCLyAuCisgKi8KKworLyogUGxhdGZvcm0tc3BlY2lmaWMgdHlwZXMgYW5kIGRlZmluaXRpb25zIGZvciBPcGVuR0wgRVMgMS5YICBnbC5oCisgKiBMYXN0IG1vZGlmaWVkIG9uIDIwMDgvMTIvMTkKKyAqCisgKiBBZG9wdGVycyBtYXkgbW9kaWZ5IGtocnBsYXRmb3JtLmggYW5kIHRoaXMgZmlsZSB0byBzdWl0IHRoZWlyIHBsYXRmb3JtLgorICogWW91IGFyZSBlbmNvdXJhZ2VkIHRvIHN1Ym1pdCBhbGwgbW9kaWZpY2F0aW9ucyB0byB0aGUgS2hyb25vcyBncm91cCBzbyB0aGF0CisgKiB0aGV5IGNhbiBiZSBpbmNsdWRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhpcyBmaWxlLiAgUGxlYXNlIHN1Ym1pdCBjaGFuZ2VzCisgKiBieSBzZW5kaW5nIHRoZW0gdG8gdGhlIHB1YmxpYyBLaHJvbm9zIEJ1Z3ppbGxhIChodHRwOi8va2hyb25vcy5vcmcvYnVnemlsbGEpCisgKiBieSBmaWxpbmcgYSBidWcgYWdhaW5zdCBwcm9kdWN0ICJPcGVuR0wtRVMiIGNvbXBvbmVudCAiUmVnaXN0cnkiLgorICovCisKKyNpbmNsdWRlIDxLSFIva2hycGxhdGZvcm0uaD4KKworI2lmbmRlZiBHTF9BUEkKKyNkZWZpbmUgR0xfQVBJICAgICAgS0hST05PU19BUElDQUxMCisjZW5kaWYKKworI2lmIGRlZmluZWQoQU5EUk9JRCkKKworI2RlZmluZSBHTF9BUElFTlRSWSBLSFJPTk9TX0FQSUVOVFJZCisKKy8vIFhYWDogdGhpcyBzaG91bGQgcHJvYmFibHkgbm90IGJlIGhlcmUKKyNkZWZpbmUgR0xfRElSRUNUX1RFWFRVUkVfMkRfUVVBTENPTU0gICAgICAgICAgICAgICAweDdFODAKKworLy8gWFhYOiBub3Qgc3VyZSBob3cgdGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkCisjZGVmaW5lIEdMX0dMRVhUX1BST1RPVFlQRVMKKworI2VuZGlmCisKKyNlbmRpZiAvKiBfX2dscGxhdGZvcm1faF8gKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0tIUi9raHJwbGF0Zm9ybS5oIGIvb3BlbmdsL2luY2x1ZGUvS0hSL2tocnBsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNjMjdjNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9pbmNsdWRlL0tIUi9raHJwbGF0Zm9ybS5oCkBAIC0wLDAgKzEsMjQxIEBACisjaWZuZGVmIF9fa2hycGxhdGZvcm1faF8KKyNkZWZpbmUgX19raHJwbGF0Zm9ybV9oXworCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKioKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisqKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKgorKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyoqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4KKyoqCisqKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgorKi8KKworLyogUGxhdGZvcm0tc3BlY2lmaWMgdHlwZXMgYW5kIGRlZmluaXRpb25zLgorICogJFJldmlzaW9uOiA3MjQ0ICQgb24gJERhdGU6IDIwMDktMDEtMjAgMTc6MDY6NTkgLTA4MDAgKFR1ZSwgMjAgSmFuIDIwMDkpICQKKyAqIAorICogQWRvcHRlcnMgbWF5IG1vZGlmeSB0aGlzIGZpbGUgdG8gc3VpdCB0aGVpciBwbGF0Zm9ybS4gQWRvcHRlcnMgYXJlCisgKiBlbmNvdXJhZ2VkIHRvIHN1Ym1pdCBwbGF0Zm9ybSBzcGVjaWZpYyBtb2RpZmljYXRpb25zIHRvIHRoZSBLaHJvbm9zCisgKiBncm91cCBzbyB0aGF0IHRoZXkgY2FuIGJlIGluY2x1ZGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUuCisgKiBQbGVhc2Ugc3VibWl0IGNoYW5nZXMgYnkgc2VuZGluZyB0aGVtIHRvIHRoZSBwdWJsaWMgS2hyb25vcyBCdWd6aWxsYQorICogKGh0dHA6Ly9raHJvbm9zLm9yZy9idWd6aWxsYSkgYnkgZmlsaW5nIGEgYnVnIGFnYWluc3QgcHJvZHVjdAorICogIktocm9ub3MgKGdlbmVyYWwpIiBjb21wb25lbnQgIlJlZ2lzdHJ5Ii4KKyAqCisgKiBBIHByZWRlZmluZWQgdGVtcGxhdGUgd2hpY2ggZmlsbHMgaW4gc29tZSBvZiB0aGUgYnVnIGZpZWxkcyBjYW4gYmUKKyAqIHJlYWNoZWQgdXNpbmcgaHR0cDovL3Rpbnl1cmwuY29tL2tocnBsYXRmb3JtLWgtYnVncmVwb3J0LCBidXQgeW91CisgKiBtdXN0IGNyZWF0ZSBhIEJ1Z3ppbGxhIGxvZ2luIGZpcnN0LgorICogCisgKgorICogU2VlIHRoZSBJbXBsZW1lbnRlcidzIEd1aWRlbGluZXMgZm9yIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHRoaXMgZmlsZQorICogc2hvdWxkIGJlIGxvY2F0ZWQgb24geW91ciBzeXN0ZW0uCisgKiAgICBodHRwOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2ltcGxlbWVudGVyc19ndWlkZS5wZGYKKyAqCisgKiAKKyAqIFRoaXMgZmlsZSBzaG91bGQgYmUgaW5jbHVkZWQgYXMKKyAqICAgICAgICAjaW5jbHVkZSA8S0hSL2tocnBsYXRmb3JtLmg+CisgKiBieSB0aGUgS2hyb25vcyBBUEkgaGVhZGVyIGZpbGUgdGhhdCB1c2VzIGl0cyB0eXBlcyBhbmQgZGVmaW5lcy4KKyAqCisgKiBUaGUgdHlwZXMgaW4gdGhpcyBmaWxlIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gZGVmaW5lIEFQSS1zcGVjaWZpYyB0eXBlcy4KKyAqIFR5cGVzIGRlZmluZWQgaW4gdGhpcyBmaWxlOgorICogICAga2hyb25vc19pbnQ4X3QgICAgICAgICAgICAgIHNpZ25lZCAgIDggIGJpdAorICogICAga2hyb25vc191aW50OF90ICAgICAgICAgICAgIHVuc2lnbmVkIDggIGJpdAorICogICAga2hyb25vc19pbnQxNl90ICAgICAgICAgICAgIHNpZ25lZCAgIDE2IGJpdAorICogICAga2hyb25vc191aW50MTZfdCAgICAgICAgICAgIHVuc2lnbmVkIDE2IGJpdAorICogICAga2hyb25vc19pbnQzMl90ICAgICAgICAgICAgIHNpZ25lZCAgIDMyIGJpdAorICogICAga2hyb25vc191aW50MzJfdCAgICAgICAgICAgIHVuc2lnbmVkIDMyIGJpdAorICogICAga2hyb25vc19pbnQ2NF90ICAgICAgICAgICAgIHNpZ25lZCAgIDY0IGJpdAorICogICAga2hyb25vc191aW50NjRfdCAgICAgICAgICAgIHVuc2lnbmVkIDY0IGJpdAorICogICAga2hyb25vc19pbnRwdHJfdCAgICAgICAgICAgIHNpZ25lZCAgIHNhbWUgbnVtYmVyIG9mIGJpdHMgYXMgYSBwb2ludGVyCisgKiAgICBraHJvbm9zX3VpbnRwdHJfdCAgICAgICAgICAgdW5zaWduZWQgc2FtZSBudW1iZXIgb2YgYml0cyBhcyBhIHBvaW50ZXIKKyAqICAgIGtocm9ub3Nfc3NpemVfdCAgICAgICAgICAgICBzaWduZWQgICBzaXplCisgKiAgICBraHJvbm9zX3VzaXplX3QgICAgICAgICAgICAgdW5zaWduZWQgc2l6ZQorICogICAga2hyb25vc19mbG9hdF90ICAgICAgICAgICAgIHNpZ25lZCAgIDMyIGJpdCBmbG9hdGluZyBwb2ludAorICogICAga2hyb25vc190aW1lX25zX3QgICAgICAgICAgIHVuc2lnbmVkIDY0IGJpdCB0aW1lIGluIG5hbm9zZWNvbmRzCisgKiAgICBraHJvbm9zX3V0aW1lX25hbm9zZWNvbmRzX3QgdW5zaWduZWQgdGltZSBpbnRlcnZhbCBvciBhYnNvbHV0ZSB0aW1lIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFub3NlY29uZHMKKyAqICAgIGtocm9ub3Nfc3RpbWVfbmFub3NlY29uZHNfdCBzaWduZWQgdGltZSBpbnRlcnZhbCBpbiBuYW5vc2Vjb25kcworICoKKyAqIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCBpcyAxIGlmIDY0IGJpdCBpbnRlZ2VycyBhcmUgc3VwcG9ydGVkOyBvdGhlcndpc2UgMC4KKyAqIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCBpcyAxIGlmIGZsb2F0cyBhcmUgc3VwcG9ydGVkOyBvdGhlcndpc2UgMC4KKyAqIAorICoKKyAqIE1hY3JvcyBkZWZpbmVkIGluIHRoaXMgZmlsZToKKyAqICAgIEtIUk9OT1NfQVBJQ0FMTAorICogICAgS0hST05PU19BUElFTlRSWQorICogICAgS0hST05PU19BUElBVFRSSUJVVEVTCisgKiBUaGVzZSBtYXkgYmUgdXNlZCBpbiBmdW5jdGlvbiBwcm90b3R5cGVzIGFzOgorICogICAgICBLSFJPTk9TX0FQSUNBTEwgdm9pZCBLSFJPTk9TX0FQSUVOVFJZIGZ1bmNuYW1lKAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZzEsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnMikgS0hST05PU19BUElBVFRSSUJVVEVTOworICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbiBvZiBLSFJPTk9TX0FQSUNBTEwKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBwcmVjZWRlcyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUuCisgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19TQ0lURUNIX1NOQVBfXykKKyMgICBkZWZpbmUgS0hST05PU19BUElDQUxMIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorI2VsaWYgZGVmaW5lZCAoX19TWU1CSUFOMzJfXykKKyMgICBkZWZpbmUgS0hST05PU19BUElDQUxMIElNUE9SVF9DCisjZWxzZQorIyAgIGRlZmluZSBLSFJPTk9TX0FQSUNBTEwKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlZmluaXRpb24gb2YgS0hST05PU19BUElFTlRSWQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIGZvbGxvd3MgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbiAgYW5kIHByZWNlZGVzIHRoZSBmdW5jdGlvbgorICogbmFtZSBpbiB0aGUgZnVuY3Rpb24gcHJvdG90eXBlLgorICovCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpICYmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pCisgICAgLyogV2luMzIgYnV0IG5vdCBXaW5DRSAqLworIyAgIGRlZmluZSBLSFJPTk9TX0FQSUVOVFJZIF9fc3RkY2FsbAorI2Vsc2UKKyMgICBkZWZpbmUgS0hST05PU19BUElFTlRSWQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbiBvZiBLSFJPTk9TX0FQSUFUVFJJQlVURVMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBmb2xsb3dzIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzIG9mIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUgYXJndW1lbnRzLgorICovCisjaWYgZGVmaW5lZCAoX19BUk1DQ18yX18pCisjZGVmaW5lIEtIUk9OT1NfQVBJQVRUUklCVVRFUyBfX3NvZnRmcAorI2Vsc2UKKyNkZWZpbmUgS0hST05PU19BUElBVFRSSUJVVEVTCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBiYXNpYyB0eXBlIGRlZmluaXRpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAoZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpIHx8IGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19TQ09fXykgfHwgZGVmaW5lZChfX1VTTENfXykKKworCisvKgorICogVXNpbmcgPHN0ZGludC5oPgorICovCisjaW5jbHVkZSA8c3RkaW50Lmg+Cit0eXBlZGVmIGludDMyX3QgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50MzJfdDsKK3R5cGVkZWYgdWludDMyX3QgICAgICAgICAgICAgICAga2hyb25vc191aW50MzJfdDsKK3R5cGVkZWYgaW50NjRfdCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQ2NF90OwordHlwZWRlZiB1aW50NjRfdCAgICAgICAgICAgICAgICBraHJvbm9zX3VpbnQ2NF90OworI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgICAxCisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCAgIDEKKworI2VsaWYgZGVmaW5lZChfX1ZNUyApIHx8IGRlZmluZWQoX19zZ2kpCisKKy8qCisgKiBVc2luZyA8aW50dHlwZXMuaD4KKyAqLworI2luY2x1ZGUgPGludHR5cGVzLmg+Cit0eXBlZGVmIGludDMyX3QgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50MzJfdDsKK3R5cGVkZWYgdWludDMyX3QgICAgICAgICAgICAgICAga2hyb25vc191aW50MzJfdDsKK3R5cGVkZWYgaW50NjRfdCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQ2NF90OwordHlwZWRlZiB1aW50NjRfdCAgICAgICAgICAgICAgICBraHJvbm9zX3VpbnQ2NF90OworI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgICAxCisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCAgIDEKKworI2VsaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pCisKKy8qCisgKiBXaW4zMgorICovCit0eXBlZGVmIF9faW50MzIgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQzMiAgICAgICAga2hyb25vc191aW50MzJfdDsKK3R5cGVkZWYgX19pbnQ2NCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICAgICAgICBraHJvbm9zX3VpbnQ2NF90OworI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgICAxCisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCAgIDEKKworI2VsaWYgZGVmaW5lZChfX3N1bl9fKSB8fCBkZWZpbmVkKF9fZGlnaXRhbF9fKQorCisvKgorICogU3VuIG9yIERpZ2l0YWwKKyAqLwordHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgICAgIGtocm9ub3NfdWludDMyX3Q7CisjaWYgZGVmaW5lZChfX2FyY2g2NF9fKSB8fCBkZWZpbmVkKF9MUDY0KQordHlwZWRlZiBsb25nIGludCAgICAgICAgICAgICAgICBraHJvbm9zX2ludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50ICAgICAgIGtocm9ub3NfdWludDY0X3Q7CisjZWxzZQordHlwZWRlZiBsb25nIGxvbmcgaW50ICAgICAgICAgICBraHJvbm9zX2ludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgIGtocm9ub3NfdWludDY0X3Q7CisjZW5kaWYgLyogX19hcmNoNjRfXyAqLworI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgICAxCisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCAgIDEKKworI2VsaWYgMAorCisvKgorICogSHlwb3RoZXRpY2FsIHBsYXRmb3JtIHdpdGggbm8gZmxvYXQgb3IgaW50NjQgc3VwcG9ydAorICovCit0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICAga2hyb25vc191aW50MzJfdDsKKyNkZWZpbmUgS0hST05PU19TVVBQT1JUX0lOVDY0ICAgMAorI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfRkxPQVQgICAwCisKKyNlbHNlCisKKy8qCisgKiBHZW5lcmljIGZhbGxiYWNrCisgKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KK3R5cGVkZWYgaW50MzJfdCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQzMl90OwordHlwZWRlZiB1aW50MzJfdCAgICAgICAgICAgICAgICBraHJvbm9zX3VpbnQzMl90OwordHlwZWRlZiBpbnQ2NF90ICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDY0X3Q7Cit0eXBlZGVmIHVpbnQ2NF90ICAgICAgICAgICAgICAgIGtocm9ub3NfdWludDY0X3Q7CisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCAgIDEKKyNkZWZpbmUgS0hST05PU19TVVBQT1JUX0ZMT0FUICAgMQorCisjZW5kaWYKKworCisvKgorICogVHlwZXMgdGhhdCBhcmUgKHNvIGZhcikgdGhlIHNhbWUgb24gYWxsIHBsYXRmb3JtcworICovCit0eXBlZGVmIHNpZ25lZCAgIGNoYXIgICAgICAgICAga2hyb25vc19pbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgICAga2hyb25vc191aW50OF90OwordHlwZWRlZiBzaWduZWQgICBzaG9ydCBpbnQgICAgIGtocm9ub3NfaW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50ICAgICBraHJvbm9zX3VpbnQxNl90OwordHlwZWRlZiBzaWduZWQgICBsb25nICBpbnQgICAgIGtocm9ub3NfaW50cHRyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIGludCAgICAga2hyb25vc191aW50cHRyX3Q7Cit0eXBlZGVmIHNpZ25lZCAgIGxvbmcgIGludCAgICAga2hyb25vc19zc2l6ZV90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nICBpbnQgICAgIGtocm9ub3NfdXNpemVfdDsKKworI2lmIEtIUk9OT1NfU1VQUE9SVF9GTE9BVAorLyoKKyAqIEZsb2F0IHR5cGUKKyAqLwordHlwZWRlZiAgICAgICAgICBmbG9hdCAgICAgICAgIGtocm9ub3NfZmxvYXRfdDsKKyNlbmRpZgorCisjaWYgS0hST05PU19TVVBQT1JUX0lOVDY0CisvKiBUaW1lIHR5cGVzCisgKgorICogVGhlc2UgdHlwZXMgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGEgdGltZSBpbnRlcnZhbCBpbiBuYW5vc2Vjb25kcyBvciAKKyAqIGFuIGFic29sdXRlIFVuYWRqdXN0ZWQgU3lzdGVtIFRpbWUuICBVbmFkanVzdGVkIFN5c3RlbSBUaW1lIGlzIHRoZSBudW1iZXIgCisgKiBvZiBuYW5vc2Vjb25kcyBzaW5jZSBzb21lIGFyYml0cmFyeSBzeXN0ZW0gZXZlbnQgKGUuZy4gc2luY2UgdGhlIGxhc3QgCisgKiB0aW1lIHRoZSBzeXN0ZW0gYm9vdGVkKS4gIFRoZSBVbmFkanVzdGVkIFN5c3RlbSBUaW1lIGlzIGFuIHVuc2lnbmVkIAorICogNjQgYml0IHZhbHVlIHRoYXQgd3JhcHMgYmFjayB0byAwIGV2ZXJ5IDU4NCB5ZWFycy4gIFRpbWUgaW50ZXJ2YWxzIAorICogbWF5IGJlIGVpdGhlciBzaWduZWQgb3IgdW5zaWduZWQuCisgKi8KK3R5cGVkZWYga2hyb25vc191aW50NjRfdCAgICAgICBraHJvbm9zX3V0aW1lX25hbm9zZWNvbmRzX3Q7Cit0eXBlZGVmIGtocm9ub3NfaW50NjRfdCAgICAgICAga2hyb25vc19zdGltZV9uYW5vc2Vjb25kc190OworI2VuZGlmCisKKworI2VuZGlmIC8qIF9fa2hycGxhdGZvcm1faF8gKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0VHTExvZ1dyYXBwZXIuamF2YSBiL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0VHTExvZ1dyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjFmYzhjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvRUdMTG9nV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsNTQ1IEBACitwYWNrYWdlIGFuZHJvaWQub3BlbmdsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0w7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xTdXJmYWNlOworCitjbGFzcyBFR0xMb2dXcmFwcGVyIGltcGxlbWVudHMgRUdMMTEgeworICAgIHByaXZhdGUgRUdMMTAgbUVnbDEwOworICAgIFdyaXRlciBtTG9nOworICAgIGJvb2xlYW4gbUxvZ0FyZ3VtZW50TmFtZXM7CisgICAgYm9vbGVhbiBtQ2hlY2tFcnJvcjsKKyAgICBwcml2YXRlIGludCBtQXJnQ291bnQ7CisKKworICAgIHB1YmxpYyBFR0xMb2dXcmFwcGVyKEVHTCBlZ2wsIGludCBjb25maWdGbGFncywgV3JpdGVyIGxvZykgeworICAgICAgICBtRWdsMTAgPSAoRUdMMTApIGVnbDsKKyAgICAgICAgbUxvZyA9IGxvZzsKKyAgICAgICAgbUxvZ0FyZ3VtZW50TmFtZXMgPQorICAgICAgICAgICAgKEdMRGVidWdIZWxwZXIuQ09ORklHX0xPR19BUkdVTUVOVF9OQU1FUyAmIGNvbmZpZ0ZsYWdzKSAhPSAwOworICAgICAgICBtQ2hlY2tFcnJvciA9CisgICAgICAgICAgICAoR0xEZWJ1Z0hlbHBlci5DT05GSUdfQ0hFQ0tfR0xfRVJST1IgJiBjb25maWdGbGFncykgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlZ2xDaG9vc2VDb25maWcoRUdMRGlzcGxheSBkaXNwbGF5LCBpbnRbXSBhdHRyaWJfbGlzdCwKKyAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MsIGludCBjb25maWdfc2l6ZSwgaW50W10gbnVtX2NvbmZpZykgeworICAgICAgICBiZWdpbigiZWdsQ2hvb3NlQ29uZmlnIik7CisgICAgICAgIGFyZygiZGlzcGxheSIsIGRpc3BsYXkpOworICAgICAgICBhcmcoImF0dHJpYl9saXN0IiwgYXR0cmliX2xpc3QpOworICAgICAgICBhcmcoImNvbmZpZ19zaXplIiwgY29uZmlnX3NpemUpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBib29sZWFuIHJlc3VsdCA9IG1FZ2wxMC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgYXR0cmliX2xpc3QsIGNvbmZpZ3MsCisgICAgICAgICAgICAgICAgY29uZmlnX3NpemUsIG51bV9jb25maWcpOworICAgICAgICBhcmcoImNvbmZpZ3MiLCBjb25maWdzKTsKKyAgICAgICAgYXJnKCJudW1fY29uZmlnIiwgbnVtX2NvbmZpZyk7CisgICAgICAgIHJldHVybnMocmVzdWx0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVnbENvcHlCdWZmZXJzKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlLAorICAgICAgICAgICAgT2JqZWN0IG5hdGl2ZV9waXhtYXApIHsKKyAgICAgICAgYmVnaW4oImVnbENvcHlCdWZmZXJzIik7CisgICAgICAgIGFyZygiZGlzcGxheSIsIGRpc3BsYXkpOworICAgICAgICBhcmcoInN1cmZhY2UiLCBzdXJmYWNlKTsKKyAgICAgICAgYXJnKCJuYXRpdmVfcGl4bWFwIiwgbmF0aXZlX3BpeG1hcCk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gbUVnbDEwLmVnbENvcHlCdWZmZXJzKGRpc3BsYXksIHN1cmZhY2UsIG5hdGl2ZV9waXhtYXApOworICAgICAgICByZXR1cm5zKHJlc3VsdCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgRUdMQ29udGV4dCBlZ2xDcmVhdGVDb250ZXh0KEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgIEVHTENvbnRleHQgc2hhcmVfY29udGV4dCwgaW50W10gYXR0cmliX2xpc3QpIHsKKyAgICAgICAgYmVnaW4oImVnbENyZWF0ZUNvbnRleHQiKTsKKyAgICAgICAgYXJnKCJkaXNwbGF5IiwgZGlzcGxheSk7CisgICAgICAgIGFyZygiY29uZmlnIiwgY29uZmlnKTsKKyAgICAgICAgYXJnKCJzaGFyZV9jb250ZXh0Iiwgc2hhcmVfY29udGV4dCk7CisgICAgICAgIGFyZygiYXR0cmliX2xpc3QiLCBhdHRyaWJfbGlzdCk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIEVHTENvbnRleHQgcmVzdWx0ID0gbUVnbDEwLmVnbENyZWF0ZUNvbnRleHQoZGlzcGxheSwgY29uZmlnLAorICAgICAgICAgICAgICAgIHNoYXJlX2NvbnRleHQsIGF0dHJpYl9saXN0KTsKKyAgICAgICAgcmV0dXJucyhyZXN1bHQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIEVHTFN1cmZhY2UgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywgaW50W10gYXR0cmliX2xpc3QpIHsKKyAgICAgICAgYmVnaW4oImVnbENyZWF0ZVBidWZmZXJTdXJmYWNlIik7CisgICAgICAgIGFyZygiZGlzcGxheSIsIGRpc3BsYXkpOworICAgICAgICBhcmcoImNvbmZpZyIsIGNvbmZpZyk7CisgICAgICAgIGFyZygiYXR0cmliX2xpc3QiLCBhdHRyaWJfbGlzdCk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIEVHTFN1cmZhY2UgcmVzdWx0ID0gbUVnbDEwLmVnbENyZWF0ZVBidWZmZXJTdXJmYWNlKGRpc3BsYXksIGNvbmZpZywKKyAgICAgICAgICAgICAgICBhdHRyaWJfbGlzdCk7CisgICAgICAgIHJldHVybnMocmVzdWx0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBFR0xTdXJmYWNlIGVnbENyZWF0ZVBpeG1hcFN1cmZhY2UoRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywgT2JqZWN0IG5hdGl2ZV9waXhtYXAsIGludFtdIGF0dHJpYl9saXN0KSB7CisgICAgICAgIGJlZ2luKCJlZ2xDcmVhdGVQaXhtYXBTdXJmYWNlIik7CisgICAgICAgIGFyZygiZGlzcGxheSIsIGRpc3BsYXkpOworICAgICAgICBhcmcoImNvbmZpZyIsIGNvbmZpZyk7CisgICAgICAgIGFyZygibmF0aXZlX3BpeG1hcCIsIG5hdGl2ZV9waXhtYXApOworICAgICAgICBhcmcoImF0dHJpYl9saXN0IiwgYXR0cmliX2xpc3QpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBFR0xTdXJmYWNlIHJlc3VsdCA9IG1FZ2wxMC5lZ2xDcmVhdGVQaXhtYXBTdXJmYWNlKGRpc3BsYXksIGNvbmZpZywKKyAgICAgICAgICAgICAgICBuYXRpdmVfcGl4bWFwLCBhdHRyaWJfbGlzdCk7CisgICAgICAgIHJldHVybnMocmVzdWx0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICBwdWJsaWMgRUdMU3VyZmFjZSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKEVHTERpc3BsYXkgZGlzcGxheSwKKyAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcsIE9iamVjdCBuYXRpdmVfd2luZG93LCBpbnRbXSBhdHRyaWJfbGlzdCkgeworICAgICAgICBiZWdpbigiZWdsQ3JlYXRlV2luZG93U3VyZmFjZSIpOworICAgICAgICBhcmcoImRpc3BsYXkiLCBkaXNwbGF5KTsKKyAgICAgICAgYXJnKCJjb25maWciLCBjb25maWcpOworICAgICAgICBhcmcoIm5hdGl2ZV93aW5kb3ciLCBuYXRpdmVfd2luZG93KTsKKyAgICAgICAgYXJnKCJhdHRyaWJfbGlzdCIsIGF0dHJpYl9saXN0KTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgRUdMU3VyZmFjZSByZXN1bHQgPSBtRWdsMTAuZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkaXNwbGF5LCBjb25maWcsCisgICAgICAgICAgICAgICAgbmF0aXZlX3dpbmRvdywgYXR0cmliX2xpc3QpOworICAgICAgICByZXR1cm5zKHJlc3VsdCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlZ2xEZXN0cm95Q29udGV4dChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbnRleHQgY29udGV4dCkgeworICAgICAgICBiZWdpbigiZWdsRGVzdHJveUNvbnRleHQiKTsKKyAgICAgICAgYXJnKCJkaXNwbGF5IiwgZGlzcGxheSk7CisgICAgICAgIGFyZygiY29udGV4dCIsIGNvbnRleHQpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBib29sZWFuIHJlc3VsdCA9IG1FZ2wxMC5lZ2xEZXN0cm95Q29udGV4dChkaXNwbGF5LCBjb250ZXh0KTsKKyAgICAgICAgcmV0dXJucyhyZXN1bHQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZWdsRGVzdHJveVN1cmZhY2UoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xTdXJmYWNlIHN1cmZhY2UpIHsKKyAgICAgICAgYmVnaW4oImVnbERlc3Ryb3lTdXJmYWNlIik7CisgICAgICAgIGFyZygiZGlzcGxheSIsIGRpc3BsYXkpOworICAgICAgICBhcmcoInN1cmZhY2UiLCBzdXJmYWNlKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtRWdsMTAuZWdsRGVzdHJveVN1cmZhY2UoZGlzcGxheSwgc3VyZmFjZSk7CisgICAgICAgIHJldHVybnMocmVzdWx0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVnbEdldENvbmZpZ0F0dHJpYihFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBjb25maWcsCisgICAgICAgICAgICBpbnQgYXR0cmlidXRlLCBpbnRbXSB2YWx1ZSkgeworICAgICAgICBiZWdpbigiZWdsR2V0Q29uZmlnQXR0cmliIik7CisgICAgICAgIGFyZygiZGlzcGxheSIsIGRpc3BsYXkpOworICAgICAgICBhcmcoImNvbmZpZyIsIGNvbmZpZyk7CisgICAgICAgIGFyZygiYXR0cmlidXRlIiwgYXR0cmlidXRlKTsKKyAgICAgICAgZW5kKCk7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gbUVnbDEwLmVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIGF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgICAgIGFyZygidmFsdWUiLCB2YWx1ZSk7CisgICAgICAgIHJldHVybnMocmVzdWx0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZWdsR2V0Q29uZmlncyhFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZ1tdIGNvbmZpZ3MsCisgICAgICAgICAgICBpbnQgY29uZmlnX3NpemUsIGludFtdIG51bV9jb25maWcpIHsKKyAgICAgICAgYmVnaW4oImVnbEdldENvbmZpZ3MiKTsKKyAgICAgICAgYXJnKCJkaXNwbGF5IiwgZGlzcGxheSk7CisgICAgICAgIGFyZygiY29uZmlnX3NpemUiLCBjb25maWdfc2l6ZSk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gbUVnbDEwLmVnbEdldENvbmZpZ3MoZGlzcGxheSwgY29uZmlncywgY29uZmlnX3NpemUsCisgICAgICAgICAgICAgICAgbnVtX2NvbmZpZyk7CisgICAgICAgIGFyZygiY29uZmlncyIsIGNvbmZpZ3MpOworICAgICAgICBhcmcoIm51bV9jb25maWciLCBudW1fY29uZmlnKTsKKyAgICAgICAgcmV0dXJucyhyZXN1bHQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIEVHTENvbnRleHQgZWdsR2V0Q3VycmVudENvbnRleHQoKSB7CisgICAgICAgIGJlZ2luKCJlZ2xHZXRDdXJyZW50Q29udGV4dCIpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBFR0xDb250ZXh0IHJlc3VsdCA9IG1FZ2wxMC5lZ2xHZXRDdXJyZW50Q29udGV4dCgpOworICAgICAgICByZXR1cm5zKHJlc3VsdCk7CisKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBFR0xEaXNwbGF5IGVnbEdldEN1cnJlbnREaXNwbGF5KCkgeworICAgICAgICBiZWdpbigiZWdsR2V0Q3VycmVudERpc3BsYXkiKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgRUdMRGlzcGxheSByZXN1bHQgPSBtRWdsMTAuZWdsR2V0Q3VycmVudERpc3BsYXkoKTsKKyAgICAgICAgcmV0dXJucyhyZXN1bHQpOworCisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgRUdMU3VyZmFjZSBlZ2xHZXRDdXJyZW50U3VyZmFjZShpbnQgcmVhZGRyYXcpIHsKKyAgICAgICAgYmVnaW4oImVnbEdldEN1cnJlbnRTdXJmYWNlIik7CisgICAgICAgIGFyZygicmVhZGRyYXciLCByZWFkZHJhdyk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIEVHTFN1cmZhY2UgcmVzdWx0ID0gbUVnbDEwLmVnbEdldEN1cnJlbnRTdXJmYWNlKHJlYWRkcmF3KTsKKyAgICAgICAgcmV0dXJucyhyZXN1bHQpOworCisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgRUdMRGlzcGxheSBlZ2xHZXREaXNwbGF5KE9iamVjdCBuYXRpdmVfZGlzcGxheSkgeworICAgICAgICBiZWdpbigiZWdsR2V0RGlzcGxheSIpOworICAgICAgICBhcmcoIm5hdGl2ZV9kaXNwbGF5IiwgbmF0aXZlX2Rpc3BsYXkpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBFR0xEaXNwbGF5IHJlc3VsdCA9IG1FZ2wxMC5lZ2xHZXREaXNwbGF5KG5hdGl2ZV9kaXNwbGF5KTsKKyAgICAgICAgcmV0dXJucyhyZXN1bHQpOworCisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGVnbEdldEVycm9yKCkgeworICAgICAgICBiZWdpbigiZWdsR2V0RXJyb3IiKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgaW50IHJlc3VsdCA9IG1FZ2wxMC5lZ2xHZXRFcnJvcigpOworICAgICAgICByZXR1cm5zKGdldEVycm9yU3RyaW5nKHJlc3VsdCkpOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZWdsSW5pdGlhbGl6ZShFR0xEaXNwbGF5IGRpc3BsYXksIGludFtdIG1ham9yX21pbm9yKSB7CisgICAgICAgIGJlZ2luKCJlZ2xJbml0aWFsaXplIik7CisgICAgICAgIGFyZygiZGlzcGxheSIsIGRpc3BsYXkpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtRWdsMTAuZWdsSW5pdGlhbGl6ZShkaXNwbGF5LCBtYWpvcl9taW5vcik7CisgICAgICAgIHJldHVybnMocmVzdWx0KTsKKyAgICAgICAgYXJnKCJtYWpvcl9taW5vciIsIG1ham9yX21pbm9yKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVnbE1ha2VDdXJyZW50KEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBkcmF3LAorICAgICAgICAgICAgRUdMU3VyZmFjZSByZWFkLCBFR0xDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgYmVnaW4oImVnbE1ha2VDdXJyZW50Iik7CisgICAgICAgIGFyZygiZGlzcGxheSIsIGRpc3BsYXkpOworICAgICAgICBhcmcoImRyYXciLCBkcmF3KTsKKyAgICAgICAgYXJnKCJyZWFkIiwgcmVhZCk7CisgICAgICAgIGFyZygiY29udGV4dCIsIGNvbnRleHQpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtRWdsMTAuZWdsTWFrZUN1cnJlbnQoZGlzcGxheSwgZHJhdywgcmVhZCwgY29udGV4dCk7CisgICAgICAgIHJldHVybnMocmVzdWx0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVnbFF1ZXJ5Q29udGV4dChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGludCBhdHRyaWJ1dGUsIGludFtdIHZhbHVlKSB7CisgICAgICAgIGJlZ2luKCJlZ2xRdWVyeUNvbnRleHQiKTsKKyAgICAgICAgYXJnKCJkaXNwbGF5IiwgZGlzcGxheSk7CisgICAgICAgIGFyZygiY29udGV4dCIsIGNvbnRleHQpOworICAgICAgICBhcmcoImF0dHJpYnV0ZSIsIGF0dHJpYnV0ZSk7CisgICAgICAgIGVuZCgpOworICAgICAgICBib29sZWFuIHJlc3VsdCA9IG1FZ2wxMC5lZ2xRdWVyeUNvbnRleHQoZGlzcGxheSwgY29udGV4dCwgYXR0cmlidXRlLAorICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgcmV0dXJucyh2YWx1ZVswXSk7CisgICAgICAgIHJldHVybnMocmVzdWx0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZWdsUXVlcnlTdHJpbmcoRUdMRGlzcGxheSBkaXNwbGF5LCBpbnQgbmFtZSkgeworICAgICAgICBiZWdpbigiZWdsUXVlcnlTdHJpbmciKTsKKyAgICAgICAgYXJnKCJkaXNwbGF5IiwgZGlzcGxheSk7CisgICAgICAgIGFyZygibmFtZSIsIG5hbWUpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG1FZ2wxMC5lZ2xRdWVyeVN0cmluZyhkaXNwbGF5LCBuYW1lKTsKKyAgICAgICAgcmV0dXJucyhyZXN1bHQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZWdsUXVlcnlTdXJmYWNlKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlLAorICAgICAgICAgICAgaW50IGF0dHJpYnV0ZSwgaW50W10gdmFsdWUpIHsKKyAgICAgICAgYmVnaW4oImVnbFF1ZXJ5U3VyZmFjZSIpOworICAgICAgICBhcmcoImRpc3BsYXkiLCBkaXNwbGF5KTsKKyAgICAgICAgYXJnKCJzdXJmYWNlIiwgc3VyZmFjZSk7CisgICAgICAgIGFyZygiYXR0cmlidXRlIiwgYXR0cmlidXRlKTsKKyAgICAgICAgZW5kKCk7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gbUVnbDEwLmVnbFF1ZXJ5U3VyZmFjZShkaXNwbGF5LCBzdXJmYWNlLCBhdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgdmFsdWUpOworICAgICAgICByZXR1cm5zKHZhbHVlWzBdKTsKKyAgICAgICAgcmV0dXJucyhyZXN1bHQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZWdsU3dhcEJ1ZmZlcnMoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xTdXJmYWNlIHN1cmZhY2UpIHsKKyAgICAgICAgYmVnaW4oImVnbEluaXRpYWxpemUiKTsKKyAgICAgICAgYXJnKCJkaXNwbGF5IiwgZGlzcGxheSk7CisgICAgICAgIGFyZygic3VyZmFjZSIsIHN1cmZhY2UpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtRWdsMTAuZWdsU3dhcEJ1ZmZlcnMoZGlzcGxheSwgc3VyZmFjZSk7CisgICAgICAgIHJldHVybnMocmVzdWx0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVnbFRlcm1pbmF0ZShFR0xEaXNwbGF5IGRpc3BsYXkpIHsKKyAgICAgICAgYmVnaW4oImVnbFRlcm1pbmF0ZSIpOworICAgICAgICBhcmcoImRpc3BsYXkiLCBkaXNwbGF5KTsKKyAgICAgICAgZW5kKCk7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gbUVnbDEwLmVnbFRlcm1pbmF0ZShkaXNwbGF5KTsKKyAgICAgICAgcmV0dXJucyhyZXN1bHQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZWdsV2FpdEdMKCkgeworICAgICAgICBiZWdpbigiZWdsV2FpdEdMIik7CisgICAgICAgIGVuZCgpOworICAgICAgICBib29sZWFuIHJlc3VsdCA9IG1FZ2wxMC5lZ2xXYWl0R0woKTsKKyAgICAgICAgcmV0dXJucyhyZXN1bHQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZWdsV2FpdE5hdGl2ZShpbnQgZW5naW5lLCBPYmplY3QgYmluZFRhcmdldCkgeworICAgICAgICBiZWdpbigiZWdsV2FpdE5hdGl2ZSIpOworICAgICAgICBhcmcoImVuZ2luZSIsIGVuZ2luZSk7CisgICAgICAgIGFyZygiYmluZFRhcmdldCIsIGJpbmRUYXJnZXQpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtRWdsMTAuZWdsV2FpdE5hdGl2ZShlbmdpbmUsIGJpbmRUYXJnZXQpOworICAgICAgICByZXR1cm5zKHJlc3VsdCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tFcnJvcigpIHsKKyAgICAgICAgaW50IGVnbEVycm9yOworICAgICAgICBpZiAoKGVnbEVycm9yID0gbUVnbDEwLmVnbEdldEVycm9yKCkpICE9IEVHTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gImVnbEVycm9yOiAiICsgZ2V0RXJyb3JTdHJpbmcoZWdsRXJyb3IpOworICAgICAgICAgICAgbG9nTGluZShlcnJvck1lc3NhZ2UpOworICAgICAgICAgICAgaWYgKG1DaGVja0Vycm9yKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdMRXhjZXB0aW9uKGVnbEVycm9yLCBlcnJvck1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvZ0xpbmUoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgbG9nKG1lc3NhZ2UgKyAnXG4nKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtTG9nLndyaXRlKG1lc3NhZ2UpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgZXhjZXB0aW9uLCBrZWVwIG9uIHRyeWluZworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGJlZ2luKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGxvZyhuYW1lICsgJygnKTsKKyAgICAgICAgbUFyZ0NvdW50ID0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXJnKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKG1BcmdDb3VudCsrID4gMCkgeworICAgICAgICAgICAgbG9nKCIsICIpOworICAgICAgICB9CisgICAgICAgIGlmIChtTG9nQXJndW1lbnROYW1lcykgeworICAgICAgICAgICAgbG9nKG5hbWUgKyAiPSIpOworICAgICAgICB9CisgICAgICAgIGxvZyh2YWx1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuZCgpIHsKKyAgICAgICAgbG9nKCIpO1xuIik7CisgICAgICAgIGZsdXNoKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZsdXNoKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUxvZy5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBtTG9nID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhcmcoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgeworICAgICAgICBhcmcobmFtZSwgSW50ZWdlci50b1N0cmluZyh2YWx1ZSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhcmcoU3RyaW5nIG5hbWUsIE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgYXJnKG5hbWUsIHRvU3RyaW5nKG9iamVjdCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhcmcoU3RyaW5nIG5hbWUsIEVHTERpc3BsYXkgb2JqZWN0KSB7CisgICAgICAgIGlmIChvYmplY3QgPT0gRUdMMTAuRUdMX0RFRkFVTFRfRElTUExBWSkgeworICAgICAgICAgICAgYXJnKG5hbWUsICJFR0wxMC5FR0xfREVGQVVMVF9ESVNQTEFZIik7CisgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0ID09IEVHTF9OT19ESVNQTEFZKSB7CisgICAgICAgICAgICBhcmcobmFtZSwgIkVHTDEwLkVHTF9OT19ESVNQTEFZIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcmcobmFtZSwgdG9TdHJpbmcob2JqZWN0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXJnKFN0cmluZyBuYW1lLCBFR0xDb250ZXh0IG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0ID09IEVHTDEwLkVHTF9OT19DT05URVhUKSB7CisgICAgICAgICAgICBhcmcobmFtZSwgIkVHTDEwLkVHTF9OT19DT05URVhUIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcmcobmFtZSwgdG9TdHJpbmcob2JqZWN0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXJnKFN0cmluZyBuYW1lLCBFR0xTdXJmYWNlIG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0ID09IEVHTDEwLkVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgICAgICBhcmcobmFtZSwgIkVHTDEwLkVHTF9OT19TVVJGQUNFIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcmcobmFtZSwgdG9TdHJpbmcob2JqZWN0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmV0dXJucyhTdHJpbmcgcmVzdWx0KSB7CisgICAgICAgIGxvZygiIHJldHVybnMgIiArIHJlc3VsdCArICI7XG4iKTsKKyAgICAgICAgZmx1c2goKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmV0dXJucyhpbnQgcmVzdWx0KSB7CisgICAgICAgIHJldHVybnMoSW50ZWdlci50b1N0cmluZyhyZXN1bHQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmV0dXJucyhib29sZWFuIHJlc3VsdCkgeworICAgICAgICByZXR1cm5zKEJvb2xlYW4udG9TdHJpbmcocmVzdWx0KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJldHVybnMoT2JqZWN0IHJlc3VsdCkgeworICAgICAgICByZXR1cm5zKHRvU3RyaW5nKHJlc3VsdCkpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gIm51bGwiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG9iai50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFyZyhTdHJpbmcgbmFtZSwgaW50W10gYXJyKSB7CisgICAgICAgIGlmIChhcnIgPT0gbnVsbCkgeworICAgICAgICAgICAgYXJnKG5hbWUsICJudWxsIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcmcobmFtZSwgdG9TdHJpbmcoYXJyLmxlbmd0aCwgYXJyLCAwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXJnKFN0cmluZyBuYW1lLCBPYmplY3RbXSBhcnIpIHsKKyAgICAgICAgaWYgKGFyciA9PSBudWxsKSB7CisgICAgICAgICAgICBhcmcobmFtZSwgIm51bGwiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFyZyhuYW1lLCB0b1N0cmluZyhhcnIubGVuZ3RoLCBhcnIsIDApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKGludCBuLCBpbnRbXSBhcnIsIGludCBvZmZzZXQpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBidWYuYXBwZW5kKCJ7XG4iKTsKKyAgICAgICAgaW50IGFyckxlbiA9IGFyci5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBvZmZzZXQgKyBpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiIFsiICsgaW5kZXggKyAiXSA9ICIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBhcnJMZW4pIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJvdXQgb2YgYm91bmRzIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYXJyW2luZGV4XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCdcbicpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKGludCBuLCBPYmplY3RbXSBhcnIsIGludCBvZmZzZXQpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBidWYuYXBwZW5kKCJ7XG4iKTsKKyAgICAgICAgaW50IGFyckxlbiA9IGFyci5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBvZmZzZXQgKyBpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiIFsiICsgaW5kZXggKyAiXSA9ICIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBhcnJMZW4pIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJvdXQgb2YgYm91bmRzIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYXJyW2luZGV4XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCdcbicpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRIZXgoaW50IHZhbHVlKSB7CisgICAgICAgIHJldHVybiAiMHgiICsgSW50ZWdlci50b0hleFN0cmluZyh2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXJyb3JTdHJpbmcoaW50IGVycm9yKSB7CisgICAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgY2FzZSBFR0xfU1VDQ0VTUzoKKyAgICAgICAgICAgIHJldHVybiAiRUdMX1NVQ0NFU1MiOworICAgICAgICBjYXNlIEVHTF9OT1RfSU5JVElBTElaRUQ6CisgICAgICAgICAgICByZXR1cm4gIkVHTF9OT1RfSU5JVElBTElaRUQiOworICAgICAgICBjYXNlIEVHTF9CQURfQUNDRVNTOgorICAgICAgICAgICAgcmV0dXJuICJFR0xfQkFEX0FDQ0VTUyI7CisgICAgICAgIGNhc2UgRUdMX0JBRF9BTExPQzoKKyAgICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9BTExPQyI7CisgICAgICAgIGNhc2UgRUdMX0JBRF9BVFRSSUJVVEU6CisgICAgICAgICAgICByZXR1cm4gIkVHTF9CQURfQVRUUklCVVRFIjsKKyAgICAgICAgY2FzZSBFR0xfQkFEX0NPTkZJRzoKKyAgICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9DT05GSUciOworICAgICAgICBjYXNlIEVHTF9CQURfQ09OVEVYVDoKKyAgICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9DT05URVhUIjsKKyAgICAgICAgY2FzZSBFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRToKKyAgICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9DVVJSRU5UX1NVUkZBQ0UiOworICAgICAgICBjYXNlIEVHTF9CQURfRElTUExBWToKKyAgICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9ESVNQTEFZIjsKKyAgICAgICAgY2FzZSBFR0xfQkFEX01BVENIOgorICAgICAgICAgICAgcmV0dXJuICJFR0xfQkFEX01BVENIIjsKKyAgICAgICAgY2FzZSBFR0xfQkFEX05BVElWRV9QSVhNQVA6CisgICAgICAgICAgICByZXR1cm4gIkVHTF9CQURfTkFUSVZFX1BJWE1BUCI7CisgICAgICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfV0lORE9XOgorICAgICAgICAgICAgcmV0dXJuICJFR0xfQkFEX05BVElWRV9XSU5ET1ciOworICAgICAgICBjYXNlIEVHTF9CQURfUEFSQU1FVEVSOgorICAgICAgICAgICAgcmV0dXJuICJFR0xfQkFEX1BBUkFNRVRFUiI7CisgICAgICAgIGNhc2UgRUdMX0JBRF9TVVJGQUNFOgorICAgICAgICAgICAgcmV0dXJuICJFR0xfQkFEX1NVUkZBQ0UiOworICAgICAgICBjYXNlIEVHTDExLkVHTF9DT05URVhUX0xPU1Q6CisgICAgICAgICAgICByZXR1cm4gIkVHTF9DT05URVhUX0xPU1QiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGdldEhleChlcnJvcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9HTERlYnVnSGVscGVyLmphdmEgYi9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9HTERlYnVnSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhMWU3MwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dMRGVidWdIZWxwZXIuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5vcGVuZ2w7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0w7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7CisKKy8qKgorICogQSBoZWxwZXIgY2xhc3MgZm9yIGRlYnVnZ2luZyBPcGVuR0wgRVMgYXBwbGljYXRpb25zLgorICoKKyAqIFdyYXBzIHRoZSBzdXBwbGllZCBHTCBpbnRlcmZhY2Ugd2l0aCBhIG5ldyBHTCBpbnRlcmZhY2UgdGhhdCBhZGRzIHN1cHBvcnQgZm9yCisgKiBlcnJvciBjaGVja2luZyBhbmQgbG9nZ2luZy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBHTERlYnVnSGVscGVyIHsKKworICAgIC8qKgorICAgICAqIFdyYXAgYW4gZXhpc3RpbmcgR0wgaW50ZXJmYWNlIGluIGEgbmV3IEdMIGludGVyZmFjZSB0aGF0IGFkZHMgc3VwcG9ydCBmb3IKKyAgICAgKiBlcnJvciBjaGVja2luZyBhbmQvb3IgbG9nZ2luZy4KKyAgICAgKiA8cD4KKyAgICAgKiBXcmFwcGluZyBtZWFucyB0aGF0IHRoZSBHTCBpbnN0YW5jZSB0aGF0IGlzIHBhc3NlZCBpbiB0byB0aGlzIG1ldGhvZCBpcworICAgICAqIHdyYXBwZWQgaW5zaWRlIGEgbmV3IEdMIGluc3RhbmNlIHRoYXQgb3B0aW9uYWxseSBwZXJmb3JtcyBhZGRpdGlvbmFsCisgICAgICogb3BlcmF0aW9ucyBiZWZvcmUgYW5kIGFmdGVyIGNhbGxpbmcgdGhlIHdyYXBwZWQgR0wgaW5zdGFuY2UuCisgICAgICogPHA+CisgICAgICogRXJyb3IgY2hlY2tpbmcgbWVhbnMgdGhhdCB0aGUgd3JhcHBlciB3aWxsIGF1dG9tYXRpY2FsbHkgY2FsbAorICAgICAqIGdsRXJyb3IgYWZ0ZXIgZWFjaCBHTCBvcGVyYXRpb24sCisgICAgICogYW5kIHRocm93IGEgR0xFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLiAoQnkgZGVzaWduLCBjYWxsaW5nIGdsRXJyb3IKKyAgICAgKiBpdHNlbGYgd2lsbCBub3QgY2F1c2UgYW4gZXhjZXB0aW9uIHRvIGJlIHRocm93bi4pIEVuYWJsaW5nIGVycm9yIGNoZWNraW5nCisgICAgICogaXMgYW4gYWx0ZXJuYXRpdmUgdG8gbWFudWFsbHkgY2FsbGluZyBnbEVycm9yIGFmdGVyIGV2ZXJ5IEdMIG9wZXJhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBMb2dnaW5nIG1lYW5zIHdyaXRpbmcgYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIGVhY2ggR0wgbWV0aG9kIGNhbGwgdG8KKyAgICAgKiBhIGxvZy4KKyAgICAgKiA8cD4KKyAgICAgKiBAcGFyYW0gZ2wgdGhlIGV4aXN0aW5nIEdMIGludGVyZmFjZS4gTXVzdCBpbXBsZW1lbnQgR0wgYW5kIEdMMTAuIE1heQorICAgICAqIG9wdGlvbmFsbHkgaW1wbGVtZW50IEdMMTEgYXMgd2VsbC4KKyAgICAgKiBAcGFyYW0gY29uZmlnRmxhZ3MgQSBiaXRtYXNrIG9mIGVycm9yIGNoZWNraW5nIGZsYWdzLgorICAgICAqIEBwYXJhbSBsb2cgLSBudWxsIHRvIGRpc2FibGUgbG9nZ2luZywgbm9uLW51bGwgdG8gZW5hYmxlIGxvZ2dpbmcuCisgICAgICogQHJldHVybiB0aGUgd3JhcHBlZCBHTCBpbnN0YW5jZS4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIENoZWNrIGdsRXJyb3IoKSBhZnRlciBldmVyeSBjYWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTkZJR19DSEVDS19HTF9FUlJPUiA9ICgxIDw8IDApOworCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYWxsIGNhbGxzIGFyZSBvbiB0aGUgc2FtZSB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORklHX0NIRUNLX1RIUkVBRCA9ICgxIDw8IDEpOworCisgICAgLyoqCisgICAgICogUHJpbnQgYXJndW1lbnQgbmFtZXMgd2hlbiBsb2dnaW5nIEdMIENhbGxzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTkZJR19MT0dfQVJHVU1FTlRfTkFNRVMgPSAoMSA8PCAyKTsKKworICAgIC8qKgorICAgICAqIFRoZSBFcnJvciBudW1iZXIgdXNlZCBpbiB0aGUgR0xFeGNlcHRpb24gdGhhdCBpcyB0aHJvd24gaWYKKyAgICAgKiBDT05GSUdfQ0hFQ0tfVEhSRUFEIGlzIGVuYWJsZWQgYW5kIHlvdSBjYWxsIE9wZW5HTCBFUyBvbiB0aGUKKyAgICAgKiBhIGRpZmZlcmVudCB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfV1JPTkdfVEhSRUFEID0gMHg3MDAwOworCisgICAgcHVibGljIHN0YXRpYyBHTCB3cmFwKEdMIGdsLCBpbnQgY29uZmlnRmxhZ3MsIFdyaXRlciBsb2cpIHsKKyAgICAgICAgaWYgKCBjb25maWdGbGFncyAhPSAwICkgeworICAgICAgICAgICAgZ2wgPSBuZXcgR0xFcnJvcldyYXBwZXIoZ2wsIGNvbmZpZ0ZsYWdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGxvZyAhPSBudWxsICkgeworICAgICAgICAgICAgYm9vbGVhbiBsb2dBcmd1bWVudE5hbWVzID0KKyAgICAgICAgICAgICAgICAoQ09ORklHX0xPR19BUkdVTUVOVF9OQU1FUyAmIGNvbmZpZ0ZsYWdzKSAhPSAwOworICAgICAgICAgICAgZ2wgPSBuZXcgR0xMb2dXcmFwcGVyKGdsLCBsb2csIGxvZ0FyZ3VtZW50TmFtZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcmFwIGFuIGV4aXN0aW5nIEVHTCBpbnRlcmZhY2UgaW4gYSBuZXcgRUdMIGludGVyZmFjZSB0aGF0IGFkZHMKKyAgICAgKiBzdXBwb3J0IGZvciBlcnJvciBjaGVja2luZyBhbmQvb3IgbG9nZ2luZy4KKyAgICAgKiBAcGFyYW0gZWdsIHRoZSBleGlzdGluZyBHTCBpbnRlcmZhY2UuIE11c3QgaW1wbGVtZW50IEVHTCBhbmQgRUdMMTAuIE1heQorICAgICAqIG9wdGlvbmFsbHkgaW1wbGVtZW50IEVHTDExIGFzIHdlbGwuCisgICAgICogQHBhcmFtIGNvbmZpZ0ZsYWdzIEEgYml0bWFzayBvZiBlcnJvciBjaGVja2luZyBmbGFncy4KKyAgICAgKiBAcGFyYW0gbG9nIC0gbnVsbCB0byBkaXNhYmxlIGxvZ2dpbmcsIG5vbi1udWxsIHRvIGVuYWJsZSBsb2dnaW5nLgorICAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQgRUdMIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEVHTCB3cmFwKEVHTCBlZ2wsIGludCBjb25maWdGbGFncywgV3JpdGVyIGxvZykgeworICAgICAgICBpZiAobG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGVnbCA9IG5ldyBFR0xMb2dXcmFwcGVyKGVnbCwgY29uZmlnRmxhZ3MsIGxvZyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVnbDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dMRXJyb3JXcmFwcGVyLmphdmEgYi9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9HTEVycm9yV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NGExYTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9HTEVycm9yV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsOTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9wZW5nbDsKKworaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5GbG9hdEJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5JbnRCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uU2hvcnRCdWZmZXI7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDsKKworLyoqCisgKiBJbXBsZW1lbnQgYW4gZXJyb3IgY2hlY2tpbmcgd3JhcHBlci4gVGhlIHdyYXBwZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGwKKyAgICAgKiBnbEVycm9yIGFmdGVyIGVhY2ggR0wgb3BlcmF0aW9uLCBhbmQgdGhyb3cgYSBHTEV4Y2VwdGlvbiBpZiBhbiBlcnJvcgorICAgICAqIG9jY3Vycy4gKEJ5IGRlc2lnbiwgY2FsbGluZyBnbEVycm9yIGl0c2VsZiB3aWxsIG5vdCBjYXVzZSBhbiBleGNlcHRpb24KKyAgICAgKiB0byBiZSB0aHJvd24uKSBFbmFibGluZyBlcnJvciBjaGVja2luZyBpcyBhbiBhbHRlcm5hdGl2ZSB0byBtYW51YWxseQorICAgICAqICBjYWxsaW5nIGdsRXJyb3IgYWZ0ZXIgZXZlcnkgR0wgb3BlcmF0aW9uLgorICovCitjbGFzcyBHTEVycm9yV3JhcHBlciBleHRlbmRzIEdMV3JhcHBlckJhc2UgeworICAgIGJvb2xlYW4gbUNoZWNrRXJyb3I7CisgICAgYm9vbGVhbiBtQ2hlY2tUaHJlYWQ7CisgICAgVGhyZWFkIG1PdXJUaHJlYWQ7CisKKyAgICBwdWJsaWMgR0xFcnJvcldyYXBwZXIoR0wgZ2wsIGludCBjb25maWdGbGFncykgeworICAgICAgICBzdXBlcihnbCk7CisgICAgICAgIG1DaGVja0Vycm9yID0gKGNvbmZpZ0ZsYWdzICYgR0xEZWJ1Z0hlbHBlci5DT05GSUdfQ0hFQ0tfR0xfRVJST1IpICE9IDA7CisgICAgICAgIG1DaGVja1RocmVhZCA9IChjb25maWdGbGFncyAmIEdMRGVidWdIZWxwZXIuQ09ORklHX0NIRUNLX1RIUkVBRCkgIT0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tUaHJlYWQoKSB7CisgICAgICAgIGlmIChtQ2hlY2tUaHJlYWQpIHsKKyAgICAgICAgICAgIFRocmVhZCBjdXJyZW50VGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtT3VyVGhyZWFkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtT3VyVGhyZWFkID0gY3VycmVudFRocmVhZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFtT3VyVGhyZWFkLmVxdWFscyhjdXJyZW50VGhyZWFkKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR0xFeGNlcHRpb24oR0xEZWJ1Z0hlbHBlci5FUlJPUl9XUk9OR19USFJFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9wZW5HTCBtZXRob2QgY2FsbGVkIGZyb20gd3JvbmcgdGhyZWFkLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0Vycm9yKCkgeworICAgICAgICBpZiAobUNoZWNrRXJyb3IpIHsKKyAgICAgICAgICAgIGludCBnbEVycm9yOworICAgICAgICAgICAgaWYgKChnbEVycm9yID0gbWdsLmdsR2V0RXJyb3IoKSkgIT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBHTEV4Y2VwdGlvbihnbEVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEdMMTAgbWV0aG9kczoKKworICAgIHB1YmxpYyB2b2lkIGdsQWN0aXZlVGV4dHVyZShpbnQgdGV4dHVyZSkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xBY3RpdmVUZXh0dXJlKHRleHR1cmUpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xBbHBoYUZ1bmMoaW50IGZ1bmMsIGZsb2F0IHJlZikgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xBbHBoYUZ1bmMoZnVuYywgcmVmKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQWxwaGFGdW5jeChpbnQgZnVuYywgaW50IHJlZikgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xBbHBoYUZ1bmN4KGZ1bmMsIHJlZik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEJpbmRUZXh0dXJlKGludCB0YXJnZXQsIGludCB0ZXh0dXJlKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbEJpbmRUZXh0dXJlKHRhcmdldCwgdGV4dHVyZSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEJsZW5kRnVuYyhpbnQgc2ZhY3RvciwgaW50IGRmYWN0b3IpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsQmxlbmRGdW5jKHNmYWN0b3IsIGRmYWN0b3IpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDbGVhcihpbnQgbWFzaykgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xDbGVhcihtYXNrKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ2xlYXJDb2xvcihmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xDbGVhckNvbG9yKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ2xlYXJDb2xvcngoaW50IHJlZCwgaW50IGdyZWVuLCBpbnQgYmx1ZSwgaW50IGFscGhhKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbENsZWFyQ29sb3J4KHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ2xlYXJEZXB0aGYoZmxvYXQgZGVwdGgpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsQ2xlYXJEZXB0aGYoZGVwdGgpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDbGVhckRlcHRoeChpbnQgZGVwdGgpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsQ2xlYXJEZXB0aHgoZGVwdGgpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDbGVhclN0ZW5jaWwoaW50IHMpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsQ2xlYXJTdGVuY2lsKHMpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDbGllbnRBY3RpdmVUZXh0dXJlKGludCB0ZXh0dXJlKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbENsaWVudEFjdGl2ZVRleHR1cmUodGV4dHVyZSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbENvbG9yNGYoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsQ29sb3I0ZihyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbENvbG9yNHgoaW50IHJlZCwgaW50IGdyZWVuLCBpbnQgYmx1ZSwgaW50IGFscGhhKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbENvbG9yNHgocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDb2xvck1hc2soYm9vbGVhbiByZWQsIGJvb2xlYW4gZ3JlZW4sIGJvb2xlYW4gYmx1ZSwKKyAgICAgICAgICAgIGJvb2xlYW4gYWxwaGEpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsQ29sb3JNYXNrKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ29sb3JQb2ludGVyKGludCBzaXplLCBpbnQgdHlwZSwgaW50IHN0cmlkZSwgQnVmZmVyIHBvaW50ZXIpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsQ29sb3JQb2ludGVyKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbENvbXByZXNzZWRUZXhJbWFnZTJEKGludCB0YXJnZXQsIGludCBsZXZlbCwKKyAgICAgICAgICAgIGludCBpbnRlcm5hbGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYm9yZGVyLAorICAgICAgICAgICAgaW50IGltYWdlU2l6ZSwgQnVmZmVyIGRhdGEpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsQ29tcHJlc3NlZFRleEltYWdlMkQodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLAorICAgICAgICAgICAgICAgIGhlaWdodCwgYm9yZGVyLCBpbWFnZVNpemUsIGRhdGEpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCB4b2Zmc2V0LAorICAgICAgICAgICAgaW50IHlvZmZzZXQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwgaW50IGltYWdlU2l6ZSwKKyAgICAgICAgICAgIEJ1ZmZlciBkYXRhKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLAorICAgICAgICAgICAgICAgIGhlaWdodCwgZm9ybWF0LCBpbWFnZVNpemUsIGRhdGEpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDb3B5VGV4SW1hZ2UyRChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYm9yZGVyKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbENvcHlUZXhJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5LCB3aWR0aCwKKyAgICAgICAgICAgICAgICBoZWlnaHQsIGJvcmRlcik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbENvcHlUZXhTdWJJbWFnZTJEKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IHhvZmZzZXQsCisgICAgICAgICAgICBpbnQgeW9mZnNldCwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsQ29weVRleFN1YkltYWdlMkQodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgeCwgeSwgd2lkdGgsCisgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ3VsbEZhY2UoaW50IG1vZGUpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsQ3VsbEZhY2UobW9kZSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERlbGV0ZVRleHR1cmVzKGludCBuLCBpbnRbXSB0ZXh0dXJlcywgaW50IG9mZnNldCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xEZWxldGVUZXh0dXJlcyhuLCB0ZXh0dXJlcywgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRGVsZXRlVGV4dHVyZXMoaW50IG4sIEludEJ1ZmZlciB0ZXh0dXJlcykgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xEZWxldGVUZXh0dXJlcyhuLCB0ZXh0dXJlcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERlcHRoRnVuYyhpbnQgZnVuYykgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xEZXB0aEZ1bmMoZnVuYyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERlcHRoTWFzayhib29sZWFuIGZsYWcpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsRGVwdGhNYXNrKGZsYWcpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEZXB0aFJhbmdlZihmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsRGVwdGhSYW5nZWYobmVhciwgZmFyKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRGVwdGhSYW5nZXgoaW50IG5lYXIsIGludCBmYXIpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsRGVwdGhSYW5nZXgobmVhciwgZmFyKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRGlzYWJsZShpbnQgY2FwKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbERpc2FibGUoY2FwKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRGlzYWJsZUNsaWVudFN0YXRlKGludCBhcnJheSkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xEaXNhYmxlQ2xpZW50U3RhdGUoYXJyYXkpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEcmF3QXJyYXlzKGludCBtb2RlLCBpbnQgZmlyc3QsIGludCBjb3VudCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xEcmF3QXJyYXlzKG1vZGUsIGZpcnN0LCBjb3VudCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERyYXdFbGVtZW50cyhpbnQgbW9kZSwgaW50IGNvdW50LCBpbnQgdHlwZSwgQnVmZmVyIGluZGljZXMpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsRHJhd0VsZW1lbnRzKG1vZGUsIGNvdW50LCB0eXBlLCBpbmRpY2VzKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRW5hYmxlKGludCBjYXApIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsRW5hYmxlKGNhcCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEVuYWJsZUNsaWVudFN0YXRlKGludCBhcnJheSkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xFbmFibGVDbGllbnRTdGF0ZShhcnJheSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEZpbmlzaCgpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsRmluaXNoKCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEZsdXNoKCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xGbHVzaCgpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xGb2dmKGludCBwbmFtZSwgZmxvYXQgcGFyYW0pIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsRm9nZihwbmFtZSwgcGFyYW0pOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xGb2dmdihpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbEZvZ2Z2KHBuYW1lLCBwYXJhbXMsIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEZvZ2Z2KGludCBwbmFtZSwgRmxvYXRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbEZvZ2Z2KHBuYW1lLCBwYXJhbXMpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xGb2d4KGludCBwbmFtZSwgaW50IHBhcmFtKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbEZvZ3gocG5hbWUsIHBhcmFtKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRm9neHYoaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsRm9neHYocG5hbWUsIHBhcmFtcywgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRm9neHYoaW50IHBuYW1lLCBJbnRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbEZvZ3h2KHBuYW1lLCBwYXJhbXMpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xGcm9udEZhY2UoaW50IG1vZGUpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsRnJvbnRGYWNlKG1vZGUpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xGcnVzdHVtZihmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsCisgICAgICAgICAgICBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsRnJ1c3R1bWYobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xGcnVzdHVteChpbnQgbGVmdCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tLCBpbnQgdG9wLCBpbnQgbmVhciwKKyAgICAgICAgICAgIGludCBmYXIpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsRnJ1c3R1bXgobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZW5UZXh0dXJlcyhpbnQgbiwgaW50W10gdGV4dHVyZXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsR2VuVGV4dHVyZXMobiwgdGV4dHVyZXMsIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdlblRleHR1cmVzKGludCBuLCBJbnRCdWZmZXIgdGV4dHVyZXMpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsR2VuVGV4dHVyZXMobiwgdGV4dHVyZXMpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnbEdldEVycm9yKCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBpbnQgcmVzdWx0ID0gbWdsLmdsR2V0RXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldEludGVnZXJ2KGludCBwbmFtZSwgaW50W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbEdldEludGVnZXJ2KHBuYW1lLCBwYXJhbXMsIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldEludGVnZXJ2KGludCBwbmFtZSwgSW50QnVmZmVyIHBhcmFtcykgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xHZXRJbnRlZ2VydihwbmFtZSwgcGFyYW1zKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2xHZXRTdHJpbmcoaW50IG5hbWUpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG1nbC5nbEdldFN0cmluZyhuYW1lKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsSGludChpbnQgdGFyZ2V0LCBpbnQgbW9kZSkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xIaW50KHRhcmdldCwgbW9kZSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExpZ2h0TW9kZWxmKGludCBwbmFtZSwgZmxvYXQgcGFyYW0pIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsTGlnaHRNb2RlbGYocG5hbWUsIHBhcmFtKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTGlnaHRNb2RlbGZ2KGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsTGlnaHRNb2RlbGZ2KHBuYW1lLCBwYXJhbXMsIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExpZ2h0TW9kZWxmdihpbnQgcG5hbWUsIEZsb2F0QnVmZmVyIHBhcmFtcykgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xMaWdodE1vZGVsZnYocG5hbWUsIHBhcmFtcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExpZ2h0TW9kZWx4KGludCBwbmFtZSwgaW50IHBhcmFtKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbExpZ2h0TW9kZWx4KHBuYW1lLCBwYXJhbSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExpZ2h0TW9kZWx4dihpbnQgcG5hbWUsIGludFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xMaWdodE1vZGVseHYocG5hbWUsIHBhcmFtcywgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTGlnaHRNb2RlbHh2KGludCBwbmFtZSwgSW50QnVmZmVyIHBhcmFtcykgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xMaWdodE1vZGVseHYocG5hbWUsIHBhcmFtcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExpZ2h0ZihpbnQgbGlnaHQsIGludCBwbmFtZSwgZmxvYXQgcGFyYW0pIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsTGlnaHRmKGxpZ2h0LCBwbmFtZSwgcGFyYW0pOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xMaWdodGZ2KGludCBsaWdodCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xMaWdodGZ2KGxpZ2h0LCBwbmFtZSwgcGFyYW1zLCBvZmZzZXQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xMaWdodGZ2KGludCBsaWdodCwgaW50IHBuYW1lLCBGbG9hdEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsTGlnaHRmdihsaWdodCwgcG5hbWUsIHBhcmFtcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExpZ2h0eChpbnQgbGlnaHQsIGludCBwbmFtZSwgaW50IHBhcmFtKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbExpZ2h0eChsaWdodCwgcG5hbWUsIHBhcmFtKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTGlnaHR4dihpbnQgbGlnaHQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbExpZ2h0eHYobGlnaHQsIHBuYW1lLCBwYXJhbXMsIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExpZ2h0eHYoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIEludEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsTGlnaHR4dihsaWdodCwgcG5hbWUsIHBhcmFtcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExpbmVXaWR0aChmbG9hdCB3aWR0aCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xMaW5lV2lkdGgod2lkdGgpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xMaW5lV2lkdGh4KGludCB3aWR0aCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xMaW5lV2lkdGh4KHdpZHRoKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTG9hZElkZW50aXR5KCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xMb2FkSWRlbnRpdHkoKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTG9hZE1hdHJpeGYoZmxvYXRbXSBtLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbExvYWRNYXRyaXhmKG0sIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExvYWRNYXRyaXhmKEZsb2F0QnVmZmVyIG0pIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsTG9hZE1hdHJpeGYobSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExvYWRNYXRyaXh4KGludFtdIG0sIGludCBvZmZzZXQpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsTG9hZE1hdHJpeHgobSwgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTG9hZE1hdHJpeHgoSW50QnVmZmVyIG0pIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsTG9hZE1hdHJpeHgobSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExvZ2ljT3AoaW50IG9wY29kZSkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xMb2dpY09wKG9wY29kZSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbE1hdGVyaWFsZihpbnQgZmFjZSwgaW50IHBuYW1lLCBmbG9hdCBwYXJhbSkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xNYXRlcmlhbGYoZmFjZSwgcG5hbWUsIHBhcmFtKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTWF0ZXJpYWxmdihpbnQgZmFjZSwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xNYXRlcmlhbGZ2KGZhY2UsIHBuYW1lLCBwYXJhbXMsIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbE1hdGVyaWFsZnYoaW50IGZhY2UsIGludCBwbmFtZSwgRmxvYXRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbE1hdGVyaWFsZnYoZmFjZSwgcG5hbWUsIHBhcmFtcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbE1hdGVyaWFseChpbnQgZmFjZSwgaW50IHBuYW1lLCBpbnQgcGFyYW0pIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsTWF0ZXJpYWx4KGZhY2UsIHBuYW1lLCBwYXJhbSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbE1hdGVyaWFseHYoaW50IGZhY2UsIGludCBwbmFtZSwgaW50W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbE1hdGVyaWFseHYoZmFjZSwgcG5hbWUsIHBhcmFtcywgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTWF0ZXJpYWx4dihpbnQgZmFjZSwgaW50IHBuYW1lLCBJbnRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbE1hdGVyaWFseHYoZmFjZSwgcG5hbWUsIHBhcmFtcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbE1hdHJpeE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsTWF0cml4TW9kZShtb2RlKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTXVsdE1hdHJpeGYoZmxvYXRbXSBtLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbE11bHRNYXRyaXhmKG0sIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbE11bHRNYXRyaXhmKEZsb2F0QnVmZmVyIG0pIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsTXVsdE1hdHJpeGYobSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbE11bHRNYXRyaXh4KGludFtdIG0sIGludCBvZmZzZXQpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsTXVsdE1hdHJpeHgobSwgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTXVsdE1hdHJpeHgoSW50QnVmZmVyIG0pIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsTXVsdE1hdHJpeHgobSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbE11bHRpVGV4Q29vcmQ0ZihpbnQgdGFyZ2V0LAorICAgICAgICAgICAgZmxvYXQgcywgZmxvYXQgdCwgZmxvYXQgciwgZmxvYXQgcSkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xNdWx0aVRleENvb3JkNGYodGFyZ2V0LCBzLCB0LCByLCBxKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTXVsdGlUZXhDb29yZDR4KGludCB0YXJnZXQsIGludCBzLCBpbnQgdCwgaW50IHIsIGludCBxKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbE11bHRpVGV4Q29vcmQ0eCh0YXJnZXQsIHMsIHQsIHIsIHEpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xOb3JtYWwzZihmbG9hdCBueCwgZmxvYXQgbnksIGZsb2F0IG56KSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbE5vcm1hbDNmKG54LCBueSwgbnopOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xOb3JtYWwzeChpbnQgbngsIGludCBueSwgaW50IG56KSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbE5vcm1hbDN4KG54LCBueSwgbnopOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xOb3JtYWxQb2ludGVyKGludCB0eXBlLCBpbnQgc3RyaWRlLCBCdWZmZXIgcG9pbnRlcikgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xOb3JtYWxQb2ludGVyKHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbE9ydGhvZihmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsCisgICAgICAgICAgICBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsT3J0aG9mKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsT3J0aG94KGludCBsZWZ0LCBpbnQgcmlnaHQsIGludCBib3R0b20sIGludCB0b3AsIGludCBuZWFyLAorICAgICAgICAgICAgaW50IGZhcikgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xPcnRob3gobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xQaXhlbFN0b3JlaShpbnQgcG5hbWUsIGludCBwYXJhbSkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xQaXhlbFN0b3JlaShwbmFtZSwgcGFyYW0pOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xQb2ludFNpemUoZmxvYXQgc2l6ZSkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xQb2ludFNpemUoc2l6ZSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFBvaW50U2l6ZXgoaW50IHNpemUpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsUG9pbnRTaXpleChzaXplKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsUG9seWdvbk9mZnNldChmbG9hdCBmYWN0b3IsIGZsb2F0IHVuaXRzKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbFBvbHlnb25PZmZzZXQoZmFjdG9yLCB1bml0cyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFBvbHlnb25PZmZzZXR4KGludCBmYWN0b3IsIGludCB1bml0cykgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xQb2x5Z29uT2Zmc2V0eChmYWN0b3IsIHVuaXRzKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsUG9wTWF0cml4KCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xQb3BNYXRyaXgoKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsUHVzaE1hdHJpeCgpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsUHVzaE1hdHJpeCgpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xSZWFkUGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgaW50IHR5cGUsIEJ1ZmZlciBwaXhlbHMpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsUmVhZFBpeGVscyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFJvdGF0ZWYoZmxvYXQgYW5nbGUsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsUm90YXRlZihhbmdsZSwgeCwgeSwgeik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFJvdGF0ZXgoaW50IGFuZ2xlLCBpbnQgeCwgaW50IHksIGludCB6KSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbFJvdGF0ZXgoYW5nbGUsIHgsIHksIHopOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xTYW1wbGVDb3ZlcmFnZShmbG9hdCB2YWx1ZSwgYm9vbGVhbiBpbnZlcnQpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsU2FtcGxlQ292ZXJhZ2UodmFsdWUsIGludmVydCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFNhbXBsZUNvdmVyYWdleChpbnQgdmFsdWUsIGJvb2xlYW4gaW52ZXJ0KSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbFNhbXBsZUNvdmVyYWdleCh2YWx1ZSwgaW52ZXJ0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsU2NhbGVmKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsU2NhbGVmKHgsIHksIHopOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xTY2FsZXgoaW50IHgsIGludCB5LCBpbnQgeikgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xTY2FsZXgoeCwgeSwgeik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFNjaXNzb3IoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsU2Npc3Nvcih4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsU2hhZGVNb2RlbChpbnQgbW9kZSkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xTaGFkZU1vZGVsKG1vZGUpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xTdGVuY2lsRnVuYyhpbnQgZnVuYywgaW50IHJlZiwgaW50IG1hc2spIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsU3RlbmNpbEZ1bmMoZnVuYywgcmVmLCBtYXNrKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsU3RlbmNpbE1hc2soaW50IG1hc2spIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsU3RlbmNpbE1hc2sobWFzayk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFN0ZW5jaWxPcChpbnQgZmFpbCwgaW50IHpmYWlsLCBpbnQgenBhc3MpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsU3RlbmNpbE9wKGZhaWwsIHpmYWlsLCB6cGFzcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleENvb3JkUG9pbnRlcihpbnQgc2l6ZSwgaW50IHR5cGUsCisgICAgICAgICAgICBpbnQgc3RyaWRlLCBCdWZmZXIgcG9pbnRlcikgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xUZXhDb29yZFBvaW50ZXIoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4RW52ZihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0IHBhcmFtKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbFRleEVudmYodGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xUZXhFbnZmdihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbFRleEVudmZ2KHRhcmdldCwgcG5hbWUsIHBhcmFtcywgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4RW52ZnYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBGbG9hdEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsVGV4RW52ZnYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4RW52eChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludCBwYXJhbSkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xUZXhFbnZ4KHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4RW52eHYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsVGV4RW52eHYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zLCBvZmZzZXQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xUZXhFbnZ4dihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIEludEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsVGV4RW52eHYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4SW1hZ2UyRChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJvcmRlciwgaW50IGZvcm1hdCwgaW50IHR5cGUsCisgICAgICAgICAgICBCdWZmZXIgcGl4ZWxzKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbFRleEltYWdlMkQodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwKKyAgICAgICAgICAgICAgICBmb3JtYXQsIHR5cGUsIHBpeGVscyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleFBhcmFtZXRlcmYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdCBwYXJhbSkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xUZXhQYXJhbWV0ZXJmKHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4UGFyYW1ldGVyeChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludCBwYXJhbSkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xUZXhQYXJhbWV0ZXJ4KHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4UGFyYW1ldGVyaXYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsMTEuZ2xUZXhQYXJhbWV0ZXJpdih0YXJnZXQsIHBuYW1lLCBwYXJhbXMsIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleFBhcmFtZXRlcml2KGludCB0YXJnZXQsIGludCBwbmFtZSwgSW50QnVmZmVyIHBhcmFtcykgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wxMS5nbFRleFBhcmFtZXRlcml2KHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleFN1YkltYWdlMkQoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgeG9mZnNldCwKKyAgICAgICAgICAgIGludCB5b2Zmc2V0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIGludCB0eXBlLAorICAgICAgICAgICAgQnVmZmVyIHBpeGVscykgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xUZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xUcmFuc2xhdGVmKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsVHJhbnNsYXRlZih4LCB5LCB6KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVHJhbnNsYXRleChpbnQgeCwgaW50IHksIGludCB6KSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbC5nbFRyYW5zbGF0ZXgoeCwgeSwgeik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFZlcnRleFBvaW50ZXIoaW50IHNpemUsIGludCB0eXBlLAorICAgICAgICAgICAgaW50IHN0cmlkZSwgQnVmZmVyIHBvaW50ZXIpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsLmdsVmVydGV4UG9pbnRlcihzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xWaWV3cG9ydChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wuZ2xWaWV3cG9ydCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ2xpcFBsYW5lZihpbnQgcGxhbmUsIGZsb2F0W10gZXF1YXRpb24sIGludCBvZmZzZXQpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsMTEuZ2xDbGlwUGxhbmVmKHBsYW5lLCBlcXVhdGlvbiwgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ2xpcFBsYW5lZihpbnQgcGxhbmUsIEZsb2F0QnVmZmVyIGVxdWF0aW9uKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbDExLmdsQ2xpcFBsYW5lZihwbGFuZSwgZXF1YXRpb24pOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDbGlwUGxhbmV4KGludCBwbGFuZSwgaW50W10gZXF1YXRpb24sIGludCBvZmZzZXQpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsMTEuZ2xDbGlwUGxhbmV4KHBsYW5lLCBlcXVhdGlvbiwgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ2xpcFBsYW5leChpbnQgcGxhbmUsIEludEJ1ZmZlciBlcXVhdGlvbikgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wxMS5nbENsaXBQbGFuZXgocGxhbmUsIGVxdWF0aW9uKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIC8vIERyYXcgVGV4dHVyZSBFeHRlbnNpb24KKworICAgIHB1YmxpYyB2b2lkIGdsRHJhd1RleGZPRVMoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwKKyAgICAgICAgZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wxMUV4dC5nbERyYXdUZXhmT0VTKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEcmF3VGV4ZnZPRVMoZmxvYXRbXSBjb29yZHMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsMTFFeHQuZ2xEcmF3VGV4ZnZPRVMoY29vcmRzLCBvZmZzZXQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEcmF3VGV4ZnZPRVMoRmxvYXRCdWZmZXIgY29vcmRzKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbDExRXh0LmdsRHJhd1RleGZ2T0VTKGNvb3Jkcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERyYXdUZXhpT0VTKGludCB4LCBpbnQgeSwgaW50IHosIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wxMUV4dC5nbERyYXdUZXhpT0VTKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEcmF3VGV4aXZPRVMoaW50W10gY29vcmRzLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbDExRXh0LmdsRHJhd1RleGl2T0VTKGNvb3Jkcywgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRHJhd1RleGl2T0VTKEludEJ1ZmZlciBjb29yZHMpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsMTFFeHQuZ2xEcmF3VGV4aXZPRVMoY29vcmRzKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRHJhd1RleHNPRVMoc2hvcnQgeCwgc2hvcnQgeSwgc2hvcnQgeiwKKyAgICAgICAgc2hvcnQgd2lkdGgsIHNob3J0IGhlaWdodCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wxMUV4dC5nbERyYXdUZXhzT0VTKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEcmF3VGV4c3ZPRVMoc2hvcnRbXSBjb29yZHMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsMTFFeHQuZ2xEcmF3VGV4c3ZPRVMoY29vcmRzLCBvZmZzZXQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEcmF3VGV4c3ZPRVMoU2hvcnRCdWZmZXIgY29vcmRzKSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbDExRXh0LmdsRHJhd1RleHN2T0VTKGNvb3Jkcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERyYXdUZXh4T0VTKGludCB4LCBpbnQgeSwgaW50IHosIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBtZ2wxMUV4dC5nbERyYXdUZXh4T0VTKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEcmF3VGV4eHZPRVMoaW50W10gY29vcmRzLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIG1nbDExRXh0LmdsRHJhd1RleHh2T0VTKGNvb3Jkcywgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRHJhd1RleHh2T0VTKEludEJ1ZmZlciBjb29yZHMpIHsKKyAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgbWdsMTFFeHQuZ2xEcmF3VGV4eHZPRVMoY29vcmRzKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2xRdWVyeU1hdHJpeHhPRVMoaW50W10gbWFudGlzc2EsIGludCBtYW50aXNzYU9mZnNldCwKKyAgICAgICAgaW50W10gZXhwb25lbnQsIGludCBleHBvbmVudE9mZnNldCkgeworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBpbnQgdmFsaWQgPSBtZ2wxMEV4dC5nbFF1ZXJ5TWF0cml4eE9FUyhtYW50aXNzYSwgbWFudGlzc2FPZmZzZXQsCisgICAgICAgICAgICBleHBvbmVudCwgZXhwb25lbnRPZmZzZXQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgICAgIHJldHVybiB2YWxpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdsUXVlcnlNYXRyaXh4T0VTKEludEJ1ZmZlciBtYW50aXNzYSwgSW50QnVmZmVyIGV4cG9uZW50KSB7CisgICAgICAgIGNoZWNrVGhyZWFkKCk7CisgICAgICAgIGludCB2YWxpZCA9IG1nbDEwRXh0LmdsUXVlcnlNYXRyaXh4T0VTKG1hbnRpc3NhLCBleHBvbmVudCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIHZhbGlkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dMRXhjZXB0aW9uLmphdmEgYi9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9HTEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MmZjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9HTEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQub3BlbmdsOworCisvKioKKyAqIEFuIGV4Y2VwdGlvbiBjbGFzcyBmb3IgT3BlbkdMIGVycm9ycy4KKyAqCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorcHVibGljIGNsYXNzIEdMRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIEdMRXhjZXB0aW9uKGZpbmFsIGludCBlcnJvcikgeworICAgICAgICBzdXBlcihnZXRFcnJvclN0cmluZyhlcnJvcikpOworICAgICAgICBtRXJyb3IgPSBlcnJvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgR0xFeGNlcHRpb24oZmluYWwgaW50IGVycm9yLCBmaW5hbCBTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIHN1cGVyKHN0cmluZyk7CisgICAgICAgIG1FcnJvciA9IGVycm9yOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFcnJvclN0cmluZyhpbnQgZXJyb3IpIHsKKyAgICAgICAgU3RyaW5nIGVycm9yU3RyaW5nID0gR0xVLmdsdUVycm9yU3RyaW5nKGVycm9yKTsKKyAgICAgICAgaWYgKCBlcnJvclN0cmluZyA9PSBudWxsICkgeworICAgICAgICAgICAgZXJyb3JTdHJpbmcgPSAiVW5rbm93biBlcnJvciAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyb3JTdHJpbmc7CisgICAgfQorCisgICAgaW50IGdldEVycm9yKCkgeworICAgICAgICByZXR1cm4gbUVycm9yOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgaW50IG1FcnJvcjsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvR0xMb2dXcmFwcGVyLmphdmEgYi9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9HTExvZ1dyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTE5YmY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvR0xMb2dXcmFwcGVyLmphdmEKQEAgLTAsMCArMSwzMDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9wZW5nbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5uaW8uQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uRG91YmxlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkZsb2F0QnVmZmVyOworaW1wb3J0IGphdmEubmlvLkludEJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5Mb25nQnVmZmVyOworaW1wb3J0IGphdmEubmlvLlNob3J0QnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDsKKworLyoqCisgKiBBIHdyYXBwZXIgdGhhdCBsb2dzIGFsbCBHTCBjYWxscyAoYW5kIHJlc3VsdHMpIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uCisgKgorICovCitjbGFzcyBHTExvZ1dyYXBwZXIgZXh0ZW5kcyBHTFdyYXBwZXJCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0lOVCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9GTE9BVCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9GSVhFRCA9IDI7CisKKyAgICBwdWJsaWMgR0xMb2dXcmFwcGVyKEdMIGdsLCBXcml0ZXIgbG9nLCBib29sZWFuIGxvZ0FyZ3VtZW50TmFtZXMpIHsKKyAgICAgICAgc3VwZXIoZ2wpOworICAgICAgICBtTG9nID0gbG9nOworICAgICAgICBtTG9nQXJndW1lbnROYW1lcyA9IGxvZ0FyZ3VtZW50TmFtZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRXJyb3IoKSB7CisgICAgICAgIGludCBnbEVycm9yOworICAgICAgICBpZiAoKGdsRXJyb3IgPSBtZ2wuZ2xHZXRFcnJvcigpKSAhPSAwKSB7CisgICAgICAgICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gImdsRXJyb3I6ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGdsRXJyb3IpOworICAgICAgICAgICAgbG9nTGluZShlcnJvck1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvZ0xpbmUoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgbG9nKG1lc3NhZ2UgKyAnXG4nKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtTG9nLndyaXRlKG1lc3NhZ2UpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgZXhjZXB0aW9uLCBrZWVwIG9uIHRyeWluZworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGJlZ2luKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGxvZyhuYW1lICsgJygnKTsKKyAgICAgICAgbUFyZ0NvdW50ID0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXJnKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKG1BcmdDb3VudCsrID4gMCkgeworICAgICAgICAgICAgbG9nKCIsICIpOworICAgICAgICB9CisgICAgICAgIGlmIChtTG9nQXJndW1lbnROYW1lcykgeworICAgICAgICAgICAgbG9nKG5hbWUgKyAiPSIpOworICAgICAgICB9CisgICAgICAgIGxvZyh2YWx1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuZCgpIHsKKyAgICAgICAgbG9nKCIpO1xuIik7CisgICAgICAgIGZsdXNoKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZsdXNoKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUxvZy5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBtTG9nID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhcmcoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgYXJnKG5hbWUsIEJvb2xlYW4udG9TdHJpbmcodmFsdWUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXJnKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgYXJnKG5hbWUsIEludGVnZXIudG9TdHJpbmcodmFsdWUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXJnKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgeworICAgICAgICBhcmcobmFtZSwgRmxvYXQudG9TdHJpbmcodmFsdWUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmV0dXJucyhTdHJpbmcgcmVzdWx0KSB7CisgICAgICAgIGxvZygiKSByZXR1cm5zICIgKyByZXN1bHQgKyAiO1xuIik7CisgICAgICAgIGZsdXNoKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJldHVybnMoaW50IHJlc3VsdCkgeworICAgICAgICByZXR1cm5zKEludGVnZXIudG9TdHJpbmcocmVzdWx0KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFyZyhTdHJpbmcgbmFtZSwgaW50IG4sIGludFtdIGFyciwgaW50IG9mZnNldCkgeworICAgICAgICBhcmcobmFtZSwgdG9TdHJpbmcobiwgRk9STUFUX0lOVCwgYXJyLCBvZmZzZXQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXJnKFN0cmluZyBuYW1lLCBpbnQgbiwgc2hvcnRbXSBhcnIsIGludCBvZmZzZXQpIHsKKyAgICAgICAgYXJnKG5hbWUsIHRvU3RyaW5nKG4sIGFyciwgb2Zmc2V0KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFyZyhTdHJpbmcgbmFtZSwgaW50IG4sIGZsb2F0W10gYXJyLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGFyZyhuYW1lLCB0b1N0cmluZyhuLCBhcnIsIG9mZnNldCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmb3JtYXR0ZWRBcHBlbmQoU3RyaW5nQnVpbGRlciBidWYsIGludCB2YWx1ZSwgaW50IGZvcm1hdCkgeworICAgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEZPUk1BVF9JTlQ6CisgICAgICAgICAgICBidWYuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZPUk1BVF9GTE9BVDoKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoRmxvYXQuaW50Qml0c1RvRmxvYXQodmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZPUk1BVF9GSVhFRDoKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQodmFsdWUgLyA2NTUzNi4wZik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKGludCBuLCBpbnQgZm9ybWF0LCBpbnRbXSBhcnIsIGludCBvZmZzZXQpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBidWYuYXBwZW5kKCJ7XG4iKTsKKyAgICAgICAgaW50IGFyckxlbiA9IGFyci5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBvZmZzZXQgKyBpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiIFsiICsgaW5kZXggKyAiXSA9ICIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBhcnJMZW4pIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJvdXQgb2YgYm91bmRzIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvcm1hdHRlZEFwcGVuZChidWYsIGFycltpbmRleF0sIGZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCdcbicpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKGludCBuLCBzaG9ydFtdIGFyciwgaW50IG9mZnNldCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIntcbiIpOworICAgICAgICBpbnQgYXJyTGVuID0gYXJyLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IG9mZnNldCArIGk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgWyIgKyBpbmRleCArICJdID0gIik7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGFyckxlbikgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIm91dCBvZiBib3VuZHMiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChhcnJbaW5kZXhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ1xuJyk7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgifSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgdG9TdHJpbmcoaW50IG4sIGZsb2F0W10gYXJyLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgie1xuIik7CisgICAgICAgIGludCBhcnJMZW4gPSBhcnIubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgaW50IGluZGV4ID0gb2Zmc2V0ICsgaTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlsiICsgaW5kZXggKyAiXSA9ICIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBhcnJMZW4pIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJvdXQgb2YgYm91bmRzIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYXJyW2luZGV4XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCdcbicpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKGludCBuLCBGbG9hdEJ1ZmZlciBidWYpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIntcbiIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiBbIiArIGkgKyAiXSA9ICIgKyBidWYuZ2V0KGkpICsgJ1xuJyk7CisgICAgICAgIH0KKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIn0iKTsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyB0b1N0cmluZyhpbnQgbiwgaW50IGZvcm1hdCwgSW50QnVmZmVyIGJ1ZikgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgie1xuIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIFsiICsgaSArICJdID0gIik7CisgICAgICAgICAgICBmb3JtYXR0ZWRBcHBlbmQoYnVpbGRlciwgYnVmLmdldChpKSwgZm9ybWF0KTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCdcbicpOworICAgICAgICB9CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgdG9TdHJpbmcoaW50IG4sIFNob3J0QnVmZmVyIGJ1ZikgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgie1xuIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIFsiICsgaSArICJdID0gIiArIGJ1Zi5nZXQoaSkgKyAnXG4nKTsKKyAgICAgICAgfQorICAgICAgICBidWlsZGVyLmFwcGVuZCgifSIpOworICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhcmcoU3RyaW5nIG5hbWUsIGludCBuLCBGbG9hdEJ1ZmZlciBidWYpIHsKKyAgICAgICAgYXJnKG5hbWUsIHRvU3RyaW5nKG4sIGJ1ZikpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhcmcoU3RyaW5nIG5hbWUsIGludCBuLCBJbnRCdWZmZXIgYnVmKSB7CisgICAgICAgIGFyZyhuYW1lLCB0b1N0cmluZyhuLCBGT1JNQVRfSU5ULCBidWYpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXJnKFN0cmluZyBuYW1lLCBpbnQgbiwgU2hvcnRCdWZmZXIgYnVmKSB7CisgICAgICAgIGFyZyhuYW1lLCB0b1N0cmluZyhuLCBidWYpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXJnUG9pbnRlcihpbnQgc2l6ZSwgaW50IHR5cGUsIGludCBzdHJpZGUsIEJ1ZmZlciBwb2ludGVyKSB7CisgICAgICAgIGFyZygic2l6ZSIsIHNpemUpOworICAgICAgICBhcmcoInR5cGUiLCBnZXRQb2ludGVyVHlwZU5hbWUodHlwZSkpOworICAgICAgICBhcmcoInN0cmlkZSIsIHN0cmlkZSk7CisgICAgICAgIGFyZygicG9pbnRlciIsIHBvaW50ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEhleChpbnQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICIweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFcnJvclN0cmluZyhpbnQgZXJyb3IpIHsKKyAgICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICBjYXNlIEdMX05PX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuICJHTF9OT19FUlJPUiI7CisgICAgICAgIGNhc2UgR0xfSU5WQUxJRF9FTlVNOgorICAgICAgICAgICAgcmV0dXJuICJHTF9JTlZBTElEX0VOVU0iOworICAgICAgICBjYXNlIEdMX0lOVkFMSURfVkFMVUU6CisgICAgICAgICAgICByZXR1cm4gIkdMX0lOVkFMSURfVkFMVUUiOworICAgICAgICBjYXNlIEdMX0lOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICAgICAgcmV0dXJuICJHTF9JTlZBTElEX09QRVJBVElPTiI7CisgICAgICAgIGNhc2UgR0xfU1RBQ0tfT1ZFUkZMT1c6CisgICAgICAgICAgICByZXR1cm4gIkdMX1NUQUNLX09WRVJGTE9XIjsKKyAgICAgICAgY2FzZSBHTF9TVEFDS19VTkRFUkZMT1c6CisgICAgICAgICAgICByZXR1cm4gIkdMX1NUQUNLX1VOREVSRkxPVyI7CisgICAgICAgIGNhc2UgR0xfT1VUX09GX01FTU9SWToKKyAgICAgICAgICAgIHJldHVybiAiR0xfT1VUX09GX01FTU9SWSI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZ2V0SGV4KGVycm9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldENsZWFyQnVmZmVyTWFzayhpbnQgbWFzaykgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpZiAoKG1hc2sgJiBHTF9ERVBUSF9CVUZGRVJfQklUKSAhPSAwKSB7CisgICAgICAgICAgICBiLmFwcGVuZCgiR0xfREVQVEhfQlVGRkVSX0JJVCIpOworICAgICAgICAgICAgbWFzayAmPSB+R0xfREVQVEhfQlVGRkVSX0JJVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG1hc2sgJiBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChiLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGIuYXBwZW5kKCIgfCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGIuYXBwZW5kKCJHTF9TVEVOQ0lMX0JVRkZFUl9CSVQiKTsKKyAgICAgICAgICAgIG1hc2sgJj0gfkdMX1NURU5DSUxfQlVGRkVSX0JJVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG1hc2sgJiBHTF9DT0xPUl9CVUZGRVJfQklUKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgiIHwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiLmFwcGVuZCgiR0xfQ09MT1JfQlVGRkVSX0JJVCIpOworICAgICAgICAgICAgbWFzayAmPSB+R0xfQ09MT1JfQlVGRkVSX0JJVDsKKyAgICAgICAgfQorICAgICAgICBpZiAobWFzayAhPSAwKSB7CisgICAgICAgICAgICBpZiAoYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgiIHwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiLmFwcGVuZChnZXRIZXgobWFzaykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmFjdG9yKGludCBmYWN0b3IpIHsKKyAgICAgICAgc3dpdGNoKGZhY3RvcikgeworICAgICAgICBjYXNlIEdMX1pFUk86CisgICAgICAgICAgICByZXR1cm4gIkdMX1pFUk8iOworICAgICAgICBjYXNlIEdMX09ORToKKyAgICAgICAgICAgIHJldHVybiAiR0xfT05FIjsKKyAgICAgICAgY2FzZSBHTF9TUkNfQ09MT1I6CisgICAgICAgICAgICByZXR1cm4gIkdMX1NSQ19DT0xPUiI7CisgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjoKKyAgICAgICAgICAgIHJldHVybiAiR0xfT05FX01JTlVTX1NSQ19DT0xPUiI7CisgICAgICAgIGNhc2UgR0xfRFNUX0NPTE9SOgorICAgICAgICAgICAgcmV0dXJuICJHTF9EU1RfQ09MT1IiOworICAgICAgICBjYXNlIEdMX09ORV9NSU5VU19EU1RfQ09MT1I6CisgICAgICAgICAgICByZXR1cm4gIkdMX09ORV9NSU5VU19EU1RfQ09MT1IiOworICAgICAgICBjYXNlIEdMX1NSQ19BTFBIQToKKyAgICAgICAgICAgIHJldHVybiAiR0xfU1JDX0FMUEhBIjsKKyAgICAgICAgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgICAgICAgICAgcmV0dXJuICJHTF9PTkVfTUlOVVNfU1JDX0FMUEhBIjsKKyAgICAgICAgY2FzZSBHTF9EU1RfQUxQSEE6CisgICAgICAgICAgICByZXR1cm4gIkdMX0RTVF9BTFBIQSI7CisgICAgICAgIGNhc2UgR0xfT05FX01JTlVTX0RTVF9BTFBIQToKKyAgICAgICAgICAgIHJldHVybiAiR0xfT05FX01JTlVTX0RTVF9BTFBIQSI7CisgICAgICAgIGNhc2UgR0xfU1JDX0FMUEhBX1NBVFVSQVRFOgorICAgICAgICAgICAgcmV0dXJuICJHTF9TUkNfQUxQSEFfU0FUVVJBVEUiOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZ2V0SGV4KGZhY3Rvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTaGFkZU1vZGVsKGludCBtb2RlbCkgeworICAgICAgICBzd2l0Y2gobW9kZWwpIHsKKyAgICAgICAgY2FzZSBHTF9GTEFUOgorICAgICAgICAgICAgcmV0dXJuICJHTF9GTEFUIjsKKyAgICAgICAgY2FzZSBHTF9TTU9PVEg6CisgICAgICAgICAgICByZXR1cm4gIkdMX1NNT09USCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZ2V0SGV4KG1vZGVsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFRleHR1cmVUYXJnZXQoaW50IHRhcmdldCkgeworICAgICAgICBzd2l0Y2ggKHRhcmdldCkgeworICAgICAgICBjYXNlIEdMX1RFWFRVUkVfMkQ6CisgICAgICAgICAgICByZXR1cm4gIkdMX1RFWFRVUkVfMkQiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGdldEhleCh0YXJnZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dHVyZUVudlRhcmdldChpbnQgdGFyZ2V0KSB7CisgICAgICAgIHN3aXRjaCAodGFyZ2V0KSB7CisgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9FTlY6CisgICAgICAgICAgICByZXR1cm4gIkdMX1RFWFRVUkVfRU5WIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBnZXRIZXgodGFyZ2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFRleHR1cmVFbnZQTmFtZShpbnQgcG5hbWUpIHsKKyAgICAgICAgc3dpdGNoIChwbmFtZSkgeworICAgICAgICBjYXNlIEdMX1RFWFRVUkVfRU5WX01PREU6CisgICAgICAgICAgICByZXR1cm4gIkdMX1RFWFRVUkVfRU5WX01PREUiOworICAgICAgICBjYXNlIEdMX1RFWFRVUkVfRU5WX0NPTE9SOgorICAgICAgICAgICAgcmV0dXJuICJHTF9URVhUVVJFX0VOVl9DT0xPUiI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZ2V0SGV4KHBuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldFRleHR1cmVFbnZQYXJhbUNvdW50KGludCBwbmFtZSkgeworICAgICAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9FTlZfTU9ERToKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEdMX1RFWFRVUkVfRU5WX0NPTE9SOgorICAgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFRleHR1cmVFbnZQYXJhbU5hbWUoZmxvYXQgcGFyYW0pIHsKKyAgICAgICAgaW50IGlwYXJhbSA9IChpbnQpIHBhcmFtOworICAgICAgICBpZiAocGFyYW0gPT0gKGZsb2F0KSBpcGFyYW0pIHsKKyAgICAgICAgICAgIHN3aXRjaCAoaXBhcmFtKSB7CisgICAgICAgICAgICBjYXNlIEdMX1JFUExBQ0U6CisgICAgICAgICAgICAgICAgcmV0dXJuICJHTF9SRVBMQUNFIjsKKyAgICAgICAgICAgIGNhc2UgR0xfTU9EVUxBVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJHTF9NT0RVTEFURSI7CisgICAgICAgICAgICBjYXNlIEdMX0RFQ0FMOgorICAgICAgICAgICAgICAgIHJldHVybiAiR0xfREVDQUwiOworICAgICAgICAgICAgY2FzZSBHTF9CTEVORDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkdMX0JMRU5EIjsKKyAgICAgICAgICAgIGNhc2UgR0xfQUREOgorICAgICAgICAgICAgICAgIHJldHVybiAiR0xfQUREIjsKKyAgICAgICAgICAgIGNhc2UgR0xfQ09NQklORToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkdMX0NPTUJJTkUiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SGV4KGlwYXJhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEZsb2F0LnRvU3RyaW5nKHBhcmFtKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRNYXRyaXhNb2RlKGludCBtYXRyaXhNb2RlKSB7CisgICAgICAgIHN3aXRjaCAobWF0cml4TW9kZSkgeworICAgICAgICBjYXNlIEdMX01PREVMVklFVzoKKyAgICAgICAgICAgIHJldHVybiAiR0xfTU9ERUxWSUVXIjsKKyAgICAgICAgY2FzZSBHTF9QUk9KRUNUSU9OOgorICAgICAgICAgICAgcmV0dXJuICJHTF9QUk9KRUNUSU9OIjsKKyAgICAgICAgY2FzZSBHTF9URVhUVVJFOgorICAgICAgICAgICAgcmV0dXJuICJHTF9URVhUVVJFIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBnZXRIZXgobWF0cml4TW9kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRDbGllbnRTdGF0ZShpbnQgY2xpZW50U3RhdGUpIHsKKyAgICAgICAgc3dpdGNoIChjbGllbnRTdGF0ZSkgeworICAgICAgICBjYXNlIEdMX0NPTE9SX0FSUkFZOgorICAgICAgICAgICAgcmV0dXJuICJHTF9DT0xPUl9BUlJBWSI7CisgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FSUkFZOgorICAgICAgICAgICAgcmV0dXJuICJHTF9WRVJURVhfQVJSQVkiOworICAgICAgICBjYXNlIEdMX05PUk1BTF9BUlJBWToKKyAgICAgICAgICAgIHJldHVybiAiR0xfTk9STUFMX0FSUkFZIjsKKyAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZOgorICAgICAgICAgICAgcmV0dXJuICJHTF9URVhUVVJFX0NPT1JEX0FSUkFZIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBnZXRIZXgoY2xpZW50U3RhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2FwKGludCBjYXApIHsKKyAgICAgICAgc3dpdGNoIChjYXApIHsKKyAgICAgICAgY2FzZSBHTF9GT0c6CisgICAgICAgICAgICByZXR1cm4gIkdMX0ZPRyI7CisgICAgICAgIGNhc2UgR0xfTElHSFRJTkc6CisgICAgICAgICAgICByZXR1cm4gIkdMX0xJR0hUSU5HIjsKKyAgICAgICAgY2FzZSBHTF9URVhUVVJFXzJEOgorICAgICAgICAgICAgcmV0dXJuICJHTF9URVhUVVJFXzJEIjsKKyAgICAgICAgY2FzZSBHTF9DVUxMX0ZBQ0U6CisgICAgICAgICAgICByZXR1cm4gIkdMX0NVTExfRkFDRSI7CisgICAgICAgIGNhc2UgR0xfQUxQSEFfVEVTVDoKKyAgICAgICAgICAgIHJldHVybiAiR0xfQUxQSEFfVEVTVCI7CisgICAgICAgIGNhc2UgR0xfQkxFTkQ6CisgICAgICAgICAgICByZXR1cm4gIkdMX0JMRU5EIjsKKyAgICAgICAgY2FzZSBHTF9DT0xPUl9MT0dJQ19PUDoKKyAgICAgICAgICAgIHJldHVybiAiR0xfQ09MT1JfTE9HSUNfT1AiOworICAgICAgICBjYXNlIEdMX0RJVEhFUjoKKyAgICAgICAgICAgIHJldHVybiAiR0xfRElUSEVSIjsKKyAgICAgICAgY2FzZSBHTF9TVEVOQ0lMX1RFU1Q6CisgICAgICAgICAgICByZXR1cm4gIkdMX1NURU5DSUxfVEVTVCI7CisgICAgICAgIGNhc2UgR0xfREVQVEhfVEVTVDoKKyAgICAgICAgICAgIHJldHVybiAiR0xfREVQVEhfVEVTVCI7CisgICAgICAgIGNhc2UgR0xfTElHSFQwOgorICAgICAgICAgICAgcmV0dXJuICJHTF9MSUdIVDAiOworICAgICAgICBjYXNlIEdMX0xJR0hUMToKKyAgICAgICAgICAgIHJldHVybiAiR0xfTElHSFQxIjsKKyAgICAgICAgY2FzZSBHTF9MSUdIVDI6CisgICAgICAgICAgICByZXR1cm4gIkdMX0xJR0hUMiI7CisgICAgICAgIGNhc2UgR0xfTElHSFQzOgorICAgICAgICAgICAgcmV0dXJuICJHTF9MSUdIVDMiOworICAgICAgICBjYXNlIEdMX0xJR0hUNDoKKyAgICAgICAgICAgIHJldHVybiAiR0xfTElHSFQ0IjsKKyAgICAgICAgY2FzZSBHTF9MSUdIVDU6CisgICAgICAgICAgICByZXR1cm4gIkdMX0xJR0hUNSI7CisgICAgICAgIGNhc2UgR0xfTElHSFQ2OgorICAgICAgICAgICAgcmV0dXJuICJHTF9MSUdIVDYiOworICAgICAgICBjYXNlIEdMX0xJR0hUNzoKKyAgICAgICAgICAgIHJldHVybiAiR0xfTElHSFQ3IjsKKyAgICAgICAgY2FzZSBHTF9QT0lOVF9TTU9PVEg6CisgICAgICAgICAgICByZXR1cm4gIkdMX1BPSU5UX1NNT09USCI7CisgICAgICAgIGNhc2UgR0xfTElORV9TTU9PVEg6CisgICAgICAgICAgICByZXR1cm4gIkdMX0xJTkVfU01PT1RIIjsKKyAgICAgICAgY2FzZSBHTF9DT0xPUl9NQVRFUklBTDoKKyAgICAgICAgICAgIHJldHVybiAiR0xfQ09MT1JfTUFURVJJQUwiOworICAgICAgICBjYXNlIEdMX05PUk1BTElaRToKKyAgICAgICAgICAgIHJldHVybiAiR0xfTk9STUFMSVpFIjsKKyAgICAgICAgY2FzZSBHTF9SRVNDQUxFX05PUk1BTDoKKyAgICAgICAgICAgIHJldHVybiAiR0xfUkVTQ0FMRV9OT1JNQUwiOworICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BUlJBWToKKyAgICAgICAgICAgIHJldHVybiAiR0xfVkVSVEVYX0FSUkFZIjsKKyAgICAgICAgY2FzZSBHTF9OT1JNQUxfQVJSQVk6CisgICAgICAgICAgICByZXR1cm4gIkdMX05PUk1BTF9BUlJBWSI7CisgICAgICAgIGNhc2UgR0xfQ09MT1JfQVJSQVk6CisgICAgICAgICAgICByZXR1cm4gIkdMX0NPTE9SX0FSUkFZIjsKKyAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZOgorICAgICAgICAgICAgcmV0dXJuICJHTF9URVhUVVJFX0NPT1JEX0FSUkFZIjsKKyAgICAgICAgY2FzZSBHTF9NVUxUSVNBTVBMRToKKyAgICAgICAgICAgIHJldHVybiAiR0xfTVVMVElTQU1QTEUiOworICAgICAgICBjYXNlIEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRToKKyAgICAgICAgICAgIHJldHVybiAiR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFIjsKKyAgICAgICAgY2FzZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FOgorICAgICAgICAgICAgcmV0dXJuICJHTF9TQU1QTEVfQUxQSEFfVE9fT05FIjsKKyAgICAgICAgY2FzZSBHTF9TQU1QTEVfQ09WRVJBR0U6CisgICAgICAgICAgICByZXR1cm4gIkdMX1NBTVBMRV9DT1ZFUkFHRSI7CisgICAgICAgIGNhc2UgR0xfU0NJU1NPUl9URVNUOgorICAgICAgICAgICAgcmV0dXJuICJHTF9TQ0lTU09SX1RFU1QiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGdldEhleChjYXApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dHVyZVBOYW1lKGludCBwbmFtZSkgeworICAgICAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9NQUdfRklMVEVSOgorICAgICAgICAgICAgcmV0dXJuICJHTF9URVhUVVJFX01BR19GSUxURVIiOworICAgICAgICBjYXNlIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUjoKKyAgICAgICAgICAgIHJldHVybiAiR0xfVEVYVFVSRV9NSU5fRklMVEVSIjsKKyAgICAgICAgY2FzZSBHTF9URVhUVVJFX1dSQVBfUzoKKyAgICAgICAgICAgIHJldHVybiAiR0xfVEVYVFVSRV9XUkFQX1MiOworICAgICAgICBjYXNlIEdMX1RFWFRVUkVfV1JBUF9UOgorICAgICAgICAgICAgcmV0dXJuICJHTF9URVhUVVJFX1dSQVBfVCI7CisgICAgICAgIGNhc2UgR0xfR0VORVJBVEVfTUlQTUFQOgorICAgICAgICAgICAgcmV0dXJuICJHTF9HRU5FUkFURV9NSVBNQVAiOworICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUzoKKyAgICAgICAgICAgIHJldHVybiAiR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBnZXRIZXgocG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dHVyZVBhcmFtTmFtZShmbG9hdCBwYXJhbSkgeworICAgICAgICBpbnQgaXBhcmFtID0gKGludCkgcGFyYW07CisgICAgICAgIGlmIChwYXJhbSA9PSAoZmxvYXQpIGlwYXJhbSkgeworICAgICAgICAgICAgc3dpdGNoIChpcGFyYW0pIHsKKyAgICAgICAgICAgIGNhc2UgR0xfQ0xBTVBfVE9fRURHRToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkdMX0NMQU1QX1RPX0VER0UiOworICAgICAgICAgICAgY2FzZSBHTF9SRVBFQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJHTF9SRVBFQVQiOworICAgICAgICAgICAgY2FzZSBHTF9ORUFSRVNUOgorICAgICAgICAgICAgICAgIHJldHVybiAiR0xfTkVBUkVTVCI7CisgICAgICAgICAgICBjYXNlIEdMX0xJTkVBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkdMX0xJTkVBUiI7CisgICAgICAgICAgICBjYXNlIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuICJHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUIjsKKyAgICAgICAgICAgIGNhc2UgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUOgorICAgICAgICAgICAgICAgIHJldHVybiAiR0xfTElORUFSX01JUE1BUF9ORUFSRVNUIjsKKyAgICAgICAgICAgIGNhc2UgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSOgorICAgICAgICAgICAgICAgIHJldHVybiAiR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSIjsKKyAgICAgICAgICAgIGNhc2UgR0xfTElORUFSX01JUE1BUF9MSU5FQVI6CisgICAgICAgICAgICAgICAgcmV0dXJuICJHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRIZXgoaXBhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRmxvYXQudG9TdHJpbmcocGFyYW0pOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEZvZ1BOYW1lKGludCBwbmFtZSkgeworICAgICAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgICAgIGNhc2UgR0xfRk9HX0RFTlNJVFk6CisgICAgICAgICAgICByZXR1cm4gIkdMX0ZPR19ERU5TSVRZIjsKKyAgICAgICAgY2FzZSBHTF9GT0dfU1RBUlQ6CisgICAgICAgICAgICByZXR1cm4gIkdMX0ZPR19TVEFSVCI7CisgICAgICAgIGNhc2UgR0xfRk9HX0VORDoKKyAgICAgICAgICAgIHJldHVybiAiR0xfRk9HX0VORCI7CisgICAgICAgIGNhc2UgR0xfRk9HX01PREU6CisgICAgICAgICAgICByZXR1cm4gIkdMX0ZPR19NT0RFIjsKKyAgICAgICAgY2FzZSBHTF9GT0dfQ09MT1I6CisgICAgICAgICAgICByZXR1cm4gIkdMX0ZPR19DT0xPUiI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZ2V0SGV4KHBuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldEZvZ1BhcmFtQ291bnQoaW50IHBuYW1lKSB7CisgICAgICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICAgICAgY2FzZSBHTF9GT0dfREVOU0lUWToKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEdMX0ZPR19TVEFSVDoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEdMX0ZPR19FTkQ6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBHTF9GT0dfTU9ERToKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEdMX0ZPR19DT0xPUjoKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRCZWdpbk1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgR0xfUE9JTlRTOgorICAgICAgICAgICAgcmV0dXJuICJHTF9QT0lOVFMiOworICAgICAgICBjYXNlIEdMX0xJTkVTOgorICAgICAgICAgICAgcmV0dXJuICJHTF9MSU5FUyI7CisgICAgICAgIGNhc2UgR0xfTElORV9MT09QOgorICAgICAgICAgICAgcmV0dXJuICJHTF9MSU5FX0xPT1AiOworICAgICAgICBjYXNlIEdMX0xJTkVfU1RSSVA6CisgICAgICAgICAgICByZXR1cm4gIkdMX0xJTkVfU1RSSVAiOworICAgICAgICBjYXNlIEdMX1RSSUFOR0xFUzoKKyAgICAgICAgICAgIHJldHVybiAiR0xfVFJJQU5HTEVTIjsKKyAgICAgICAgY2FzZSBHTF9UUklBTkdMRV9TVFJJUDoKKyAgICAgICAgICAgIHJldHVybiAiR0xfVFJJQU5HTEVfU1RSSVAiOworICAgICAgICBjYXNlIEdMX1RSSUFOR0xFX0ZBTjoKKyAgICAgICAgICAgIHJldHVybiAiR0xfVFJJQU5HTEVfRkFOIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBnZXRIZXgobW9kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRJbmRleFR5cGUoaW50IHR5cGUpIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlQ6CisgICAgICAgICAgICByZXR1cm4gIkdMX1VOU0lHTkVEX1NIT1JUIjsKKyAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgorICAgICAgICAgICAgcmV0dXJuICJHTF9VTlNJR05FRF9CWVRFIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBnZXRIZXgodHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRJbnRlZ2VyU3RhdGVOYW1lKGludCBwbmFtZSkgeworICAgICAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgICAgIGNhc2UgR0xfQUxQSEFfQklUUzoKKyAgICAgICAgICAgIHJldHVybiAiR0xfQUxQSEFfQklUUyI7CisgICAgICAgIGNhc2UgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFOgorICAgICAgICAgICAgcmV0dXJuICJHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UiOworICAgICAgICBjYXNlIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRToKKyAgICAgICAgICAgIHJldHVybiAiR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFIjsKKyAgICAgICAgY2FzZSBHTF9CTFVFX0JJVFM6CisgICAgICAgICAgICByZXR1cm4gIkdMX0JMVUVfQklUUyI7CisgICAgICAgIGNhc2UgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6CisgICAgICAgICAgICByZXR1cm4gIkdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIjsKKyAgICAgICAgY2FzZSBHTF9ERVBUSF9CSVRTOgorICAgICAgICAgICAgcmV0dXJuICJHTF9ERVBUSF9CSVRTIjsKKyAgICAgICAgY2FzZSBHTF9HUkVFTl9CSVRTOgorICAgICAgICAgICAgcmV0dXJuICJHTF9HUkVFTl9CSVRTIjsKKyAgICAgICAgY2FzZSBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUzoKKyAgICAgICAgICAgIHJldHVybiAiR0xfTUFYX0VMRU1FTlRTX0lORElDRVMiOworICAgICAgICBjYXNlIEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUzoKKyAgICAgICAgICAgIHJldHVybiAiR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTIjsKKyAgICAgICAgY2FzZSBHTF9NQVhfTElHSFRTOgorICAgICAgICAgICAgcmV0dXJuICJHTF9NQVhfTElHSFRTIjsKKyAgICAgICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9TSVpFOgorICAgICAgICAgICAgcmV0dXJuICJHTF9NQVhfVEVYVFVSRV9TSVpFIjsKKyAgICAgICAgY2FzZSBHTF9NQVhfVklFV1BPUlRfRElNUzoKKyAgICAgICAgICAgIHJldHVybiAiR0xfTUFYX1ZJRVdQT1JUX0RJTVMiOworICAgICAgICBjYXNlIEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEg6CisgICAgICAgICAgICByZXR1cm4gIkdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEgiOworICAgICAgICBjYXNlIEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIOgorICAgICAgICAgICAgcmV0dXJuICJHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSCI7CisgICAgICAgIGNhc2UgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEg6CisgICAgICAgICAgICByZXR1cm4gIkdMX01BWF9URVhUVVJFX1NUQUNLX0RFUFRIIjsKKyAgICAgICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9VTklUUzoKKyAgICAgICAgICAgIHJldHVybiAiR0xfTUFYX1RFWFRVUkVfVU5JVFMiOworICAgICAgICBjYXNlIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUzoKKyAgICAgICAgICAgIHJldHVybiAiR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIjsKKyAgICAgICAgY2FzZSBHTF9SRURfQklUUzoKKyAgICAgICAgICAgIHJldHVybiAiR0xfUkVEX0JJVFMiOworICAgICAgICBjYXNlIEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFOgorICAgICAgICAgICAgcmV0dXJuICJHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRSI7CisgICAgICAgIGNhc2UgR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0U6CisgICAgICAgICAgICByZXR1cm4gIkdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFIjsKKyAgICAgICAgY2FzZSBHTF9TVEVOQ0lMX0JJVFM6CisgICAgICAgICAgICByZXR1cm4gIkdMX1NURU5DSUxfQklUUyI7CisgICAgICAgIGNhc2UgR0xfU1VCUElYRUxfQklUUzoKKyAgICAgICAgICAgIHJldHVybiAiR0xfU1VCUElYRUxfQklUUyI7CisKKyAgICAgICAgY2FzZSBHTF9NT0RFTFZJRVdfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUzoKKyAgICAgICAgICAgIHJldHVybiAiR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMiOworICAgICAgICBjYXNlIEdMX1BST0pFQ1RJT05fTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUzoKKyAgICAgICAgICAgIHJldHVybiAiR0xfUFJPSkVDVElPTl9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTIjsKKyAgICAgICAgY2FzZSBHTF9URVhUVVJFX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVM6CisgICAgICAgICAgICByZXR1cm4gIkdMX1RFWFRVUkVfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyI7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBnZXRIZXgocG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0SW50ZWdlclN0YXRlU2l6ZShpbnQgcG5hbWUpIHsKKyAgICAgICAgc3dpdGNoIChwbmFtZSkgeworICAgICAgICBjYXNlIEdMX0FMUEhBX0JJVFM6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0U6CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgY2FzZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0U6CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgY2FzZSBHTF9CTFVFX0JJVFM6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUzoKKyAgICAgICAgICAgIC8vIEhhdmUgdG8gYXNrIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHNpemUKKyAgICAgICAgeworICAgICAgICAgICAgaW50W10gYnVmZmVyID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgIG1nbC5nbEdldEludGVnZXJ2KEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUywgYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIHJldHVybiBidWZmZXJbMF07CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHTF9ERVBUSF9CSVRTOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgR0xfR1JFRU5fQklUUzoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgR0xfTUFYX0xJR0hUUzoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEdMX01BWF9URVhUVVJFX1NJWkU6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBHTF9NQVhfVklFV1BPUlRfRElNUzoKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBjYXNlIEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEg6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSDoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEdMX01BWF9URVhUVVJFX1NUQUNLX0RFUFRIOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgR0xfTUFYX1RFWFRVUkVfVU5JVFM6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBHTF9SRURfQklUUzoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFOgorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIGNhc2UgR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0U6CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgY2FzZSBHTF9TVEVOQ0lMX0JJVFM6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBHTF9TVUJQSVhFTF9CSVRTOgorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgY2FzZSBHTF9NT0RFTFZJRVdfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUzoKKyAgICAgICAgY2FzZSBHTF9QUk9KRUNUSU9OX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVM6CisgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTOgorICAgICAgICAgICAgcmV0dXJuIDE2OworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldEludGVnZXJTdGF0ZUZvcm1hdChpbnQgcG5hbWUpIHsKKyAgICAgICAgc3dpdGNoIChwbmFtZSkgeworICAgICAgICBjYXNlIEdMX01PREVMVklFV19NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTOgorICAgICAgICBjYXNlIEdMX1BST0pFQ1RJT05fTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUzoKKyAgICAgICAgY2FzZSBHTF9URVhUVVJFX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVM6CisgICAgICAgICAgICByZXR1cm4gRk9STUFUX0ZMT0FUOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRk9STUFUX0lOVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEhpbnRUYXJnZXQoaW50IHRhcmdldCkgeworICAgICAgICBzd2l0Y2ggKHRhcmdldCkgeworICAgICAgICBjYXNlIEdMX0ZPR19ISU5UOgorICAgICAgICAgICAgcmV0dXJuICJHTF9GT0dfSElOVCI7CisgICAgICAgIGNhc2UgR0xfTElORV9TTU9PVEhfSElOVDoKKyAgICAgICAgICAgIHJldHVybiAiR0xfTElORV9TTU9PVEhfSElOVCI7CisgICAgICAgIGNhc2UgR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5UOgorICAgICAgICAgICAgcmV0dXJuICJHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQiOworICAgICAgICBjYXNlIEdMX1BPSU5UX1NNT09USF9ISU5UOgorICAgICAgICAgICAgcmV0dXJuICJHTF9QT0lOVF9TTU9PVEhfSElOVCI7CisgICAgICAgIGNhc2UgR0xfUE9MWUdPTl9TTU9PVEhfSElOVDoKKyAgICAgICAgICAgIHJldHVybiAiR0xfUE9MWUdPTl9TTU9PVEhfSElOVCI7CisgICAgICAgIGNhc2UgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQ6CisgICAgICAgICAgICByZXR1cm4gIkdMX0dFTkVSQVRFX01JUE1BUF9ISU5UIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBnZXRIZXgodGFyZ2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEhpbnRNb2RlKGludCBtb2RlKSB7CisgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIEdMX0ZBU1RFU1Q6CisgICAgICAgICAgICByZXR1cm4gIkdMX0ZBU1RFU1QiOworICAgICAgICBjYXNlIEdMX05JQ0VTVDoKKyAgICAgICAgICAgIHJldHVybiAiR0xfTklDRVNUIjsKKyAgICAgICAgY2FzZSBHTF9ET05UX0NBUkU6CisgICAgICAgICAgICByZXR1cm4gIkdMX0RPTlRfQ0FSRSI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZ2V0SGV4KG1vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmFjZU5hbWUoaW50IGZhY2UpIHsKKyAgICAgICAgc3dpdGNoIChmYWNlKSB7CisgICAgICAgIGNhc2UgR0xfRlJPTlRfQU5EX0JBQ0s6CisgICAgICAgICAgICByZXR1cm4gIkdMX0ZST05UX0FORF9CQUNLIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBnZXRIZXgoZmFjZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRNYXRlcmlhbFBOYW1lKGludCBwbmFtZSkgeworICAgICAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgICAgIGNhc2UgR0xfQU1CSUVOVDoKKyAgICAgICAgICAgIHJldHVybiAiR0xfQU1CSUVOVCI7CisgICAgICAgIGNhc2UgR0xfRElGRlVTRToKKyAgICAgICAgICAgIHJldHVybiAiR0xfRElGRlVTRSI7CisgICAgICAgIGNhc2UgR0xfU1BFQ1VMQVI6CisgICAgICAgICAgICByZXR1cm4gIkdMX1NQRUNVTEFSIjsKKyAgICAgICAgY2FzZSBHTF9FTUlTU0lPTjoKKyAgICAgICAgICAgIHJldHVybiAiR0xfRU1JU1NJT04iOworICAgICAgICBjYXNlIEdMX1NISU5JTkVTUzoKKyAgICAgICAgICAgIHJldHVybiAiR0xfU0hJTklORVNTIjsKKyAgICAgICAgY2FzZSBHTF9BTUJJRU5UX0FORF9ESUZGVVNFOgorICAgICAgICAgICAgcmV0dXJuICJHTF9BTUJJRU5UX0FORF9ESUZGVVNFIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBnZXRIZXgocG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0TWF0ZXJpYWxQYXJhbUNvdW50KGludCBwbmFtZSkgeworICAgICAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgICAgIGNhc2UgR0xfQU1CSUVOVDoKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICBjYXNlIEdMX0RJRkZVU0U6CisgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgY2FzZSBHTF9TUEVDVUxBUjoKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICBjYXNlIEdMX0VNSVNTSU9OOgorICAgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgIGNhc2UgR0xfU0hJTklORVNTOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgR0xfQU1CSUVOVF9BTkRfRElGRlVTRToKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRMaWdodE5hbWUoaW50IGxpZ2h0KSB7CisgICAgICAgIGlmIChsaWdodCA+PSBHTF9MSUdIVDAgJiYgbGlnaHQgPD0gR0xfTElHSFQ3KSB7CisgICAgICAgICAgICByZXR1cm4gIkdMX0xJR0hUIiArIEludGVnZXIudG9TdHJpbmcobGlnaHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRIZXgobGlnaHQpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldExpZ2h0UE5hbWUoaW50IHBuYW1lKSB7CisgICAgICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICAgICAgY2FzZSBHTF9BTUJJRU5UOgorICAgICAgICAgICAgcmV0dXJuICJHTF9BTUJJRU5UIjsKKyAgICAgICAgY2FzZSBHTF9ESUZGVVNFOgorICAgICAgICAgICAgcmV0dXJuICJHTF9ESUZGVVNFIjsKKyAgICAgICAgY2FzZSBHTF9TUEVDVUxBUjoKKyAgICAgICAgICAgIHJldHVybiAiR0xfU1BFQ1VMQVIiOworICAgICAgICBjYXNlIEdMX1BPU0lUSU9OOgorICAgICAgICAgICAgcmV0dXJuICJHTF9QT1NJVElPTiI7CisgICAgICAgIGNhc2UgR0xfU1BPVF9ESVJFQ1RJT046CisgICAgICAgICAgICByZXR1cm4gIkdMX1NQT1RfRElSRUNUSU9OIjsKKyAgICAgICAgY2FzZSBHTF9TUE9UX0VYUE9ORU5UOgorICAgICAgICAgICAgcmV0dXJuICJHTF9TUE9UX0VYUE9ORU5UIjsKKyAgICAgICAgY2FzZSBHTF9TUE9UX0NVVE9GRjoKKyAgICAgICAgICAgIHJldHVybiAiR0xfU1BPVF9DVVRPRkYiOworICAgICAgICBjYXNlIEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OOgorICAgICAgICAgICAgcmV0dXJuICJHTF9DT05TVEFOVF9BVFRFTlVBVElPTiI7CisgICAgICAgIGNhc2UgR0xfTElORUFSX0FUVEVOVUFUSU9OOgorICAgICAgICAgICAgcmV0dXJuICJHTF9MSU5FQVJfQVRURU5VQVRJT04iOworICAgICAgICBjYXNlIEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTjoKKyAgICAgICAgICAgIHJldHVybiAiR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBnZXRIZXgocG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0TGlnaHRQYXJhbUNvdW50KGludCBwbmFtZSkgeworICAgICAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgICAgIGNhc2UgR0xfQU1CSUVOVDoKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICBjYXNlIEdMX0RJRkZVU0U6CisgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgY2FzZSBHTF9TUEVDVUxBUjoKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICBjYXNlIEdMX1BPU0lUSU9OOgorICAgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgIGNhc2UgR0xfU1BPVF9ESVJFQ1RJT046CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgY2FzZSBHTF9TUE9UX0VYUE9ORU5UOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgR0xfU1BPVF9DVVRPRkY6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTjoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEdMX0xJTkVBUl9BVFRFTlVBVElPTjoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTjoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRMaWdodE1vZGVsUE5hbWUoaW50IHBuYW1lKSB7CisgICAgICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICAgICAgY2FzZSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UOgorICAgICAgICAgICAgcmV0dXJuICJHTF9MSUdIVF9NT0RFTF9BTUJJRU5UIjsKKyAgICAgICAgY2FzZSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERToKKyAgICAgICAgICAgIHJldHVybiAiR0xfTElHSFRfTU9ERUxfVFdPX1NJREUiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGdldEhleChwbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRMaWdodE1vZGVsUGFyYW1Db3VudChpbnQgcG5hbWUpIHsKKyAgICAgICAgc3dpdGNoIChwbmFtZSkgeworICAgICAgICBjYXNlIEdMX0xJR0hUX01PREVMX0FNQklFTlQ6CisgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgY2FzZSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERToKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRQb2ludGVyVHlwZU5hbWUoaW50IHR5cGUpIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgR0xfQllURToKKyAgICAgICAgICAgIHJldHVybiAiR0xfQllURSI7CisgICAgICAgIGNhc2UgR0xfVU5TSUdORURfQllURToKKyAgICAgICAgICAgIHJldHVybiAiR0xfVU5TSUdORURfQllURSI7CisgICAgICAgIGNhc2UgR0xfU0hPUlQ6CisgICAgICAgICAgICByZXR1cm4gIkdMX1NIT1JUIjsKKyAgICAgICAgY2FzZSBHTF9GSVhFRDoKKyAgICAgICAgICAgIHJldHVybiAiR0xfRklYRUQiOworICAgICAgICBjYXNlIEdMX0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuICJHTF9GTE9BVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZ2V0SGV4KHR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIHRvQnl0ZUJ1ZmZlcihpbnQgYnl0ZUNvdW50LCBCdWZmZXIgaW5wdXQpIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciByZXN1bHQgPSBudWxsOworICAgICAgICBib29sZWFuIGNvbnZlcnRXaG9sZUJ1ZmZlciA9IChieXRlQ291bnQgPCAwKTsKKyAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgQnl0ZUJ1ZmZlcikgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dDIgPSAoQnl0ZUJ1ZmZlcikgaW5wdXQ7CisgICAgICAgICAgICBpZiAoY29udmVydFdob2xlQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gaW5wdXQyLmxpbWl0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGJ5dGVDb3VudCkub3JkZXIoaW5wdXQyLm9yZGVyKCkpOworICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gaW5wdXQyLnBvc2l0aW9uKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1dChpbnB1dDIuZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXQyLnBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENoYXJCdWZmZXIpIHsKKyAgICAgICAgICAgIENoYXJCdWZmZXIgaW5wdXQyID0gKENoYXJCdWZmZXIpIGlucHV0OworICAgICAgICAgICAgaWYgKGNvbnZlcnRXaG9sZUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IGlucHV0Mi5saW1pdCgpICogMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoYnl0ZUNvdW50KS5vcmRlcihpbnB1dDIub3JkZXIoKSk7CisgICAgICAgICAgICBDaGFyQnVmZmVyIHJlc3VsdDIgPSByZXN1bHQuYXNDaGFyQnVmZmVyKCk7CisgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBpbnB1dDIucG9zaXRpb24oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZUNvdW50IC8gMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0Mi5wdXQoaW5wdXQyLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlucHV0Mi5wb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBTaG9ydEJ1ZmZlcikgeworICAgICAgICAgICAgU2hvcnRCdWZmZXIgaW5wdXQyID0gKFNob3J0QnVmZmVyKSBpbnB1dDsKKyAgICAgICAgICAgIGlmIChjb252ZXJ0V2hvbGVCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBieXRlQ291bnQgPSBpbnB1dDIubGltaXQoKSAqIDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGJ5dGVDb3VudCkub3JkZXIoaW5wdXQyLm9yZGVyKCkpOworICAgICAgICAgICAgU2hvcnRCdWZmZXIgcmVzdWx0MiA9IHJlc3VsdC5hc1Nob3J0QnVmZmVyKCk7CisgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBpbnB1dDIucG9zaXRpb24oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZUNvdW50IC8gMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0Mi5wdXQoaW5wdXQyLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlucHV0Mi5wb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJbnRCdWZmZXIpIHsKKyAgICAgICAgICAgIEludEJ1ZmZlciBpbnB1dDIgPSAoSW50QnVmZmVyKSBpbnB1dDsKKyAgICAgICAgICAgIGlmIChjb252ZXJ0V2hvbGVCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBieXRlQ291bnQgPSBpbnB1dDIubGltaXQoKSAqIDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGJ5dGVDb3VudCkub3JkZXIoaW5wdXQyLm9yZGVyKCkpOworICAgICAgICAgICAgSW50QnVmZmVyIHJlc3VsdDIgPSByZXN1bHQuYXNJbnRCdWZmZXIoKTsKKyAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGlucHV0Mi5wb3NpdGlvbigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlQ291bnQgLyA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICByZXN1bHQyLnB1dChpbnB1dDIuZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXQyLnBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEZsb2F0QnVmZmVyKSB7CisgICAgICAgICAgICBGbG9hdEJ1ZmZlciBpbnB1dDIgPSAoRmxvYXRCdWZmZXIpIGlucHV0OworICAgICAgICAgICAgaWYgKGNvbnZlcnRXaG9sZUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IGlucHV0Mi5saW1pdCgpICogNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoYnl0ZUNvdW50KS5vcmRlcihpbnB1dDIub3JkZXIoKSk7CisgICAgICAgICAgICBGbG9hdEJ1ZmZlciByZXN1bHQyID0gcmVzdWx0LmFzRmxvYXRCdWZmZXIoKTsKKyAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGlucHV0Mi5wb3NpdGlvbigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlQ291bnQgLyA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICByZXN1bHQyLnB1dChpbnB1dDIuZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXQyLnBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIERvdWJsZUJ1ZmZlcikgeworICAgICAgICAgICAgRG91YmxlQnVmZmVyIGlucHV0MiA9IChEb3VibGVCdWZmZXIpIGlucHV0OworICAgICAgICAgICAgaWYgKGNvbnZlcnRXaG9sZUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IGlucHV0Mi5saW1pdCgpICogODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoYnl0ZUNvdW50KS5vcmRlcihpbnB1dDIub3JkZXIoKSk7CisgICAgICAgICAgICBEb3VibGVCdWZmZXIgcmVzdWx0MiA9IHJlc3VsdC5hc0RvdWJsZUJ1ZmZlcigpOworICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gaW5wdXQyLnBvc2l0aW9uKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVDb3VudCAvIDg7IGkrKykgeworICAgICAgICAgICAgICAgIHJlc3VsdDIucHV0KGlucHV0Mi5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnB1dDIucG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgTG9uZ0J1ZmZlcikgeworICAgICAgICAgICAgTG9uZ0J1ZmZlciBpbnB1dDIgPSAoTG9uZ0J1ZmZlcikgaW5wdXQ7CisgICAgICAgICAgICBpZiAoY29udmVydFdob2xlQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gaW5wdXQyLmxpbWl0KCkgKiA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShieXRlQ291bnQpLm9yZGVyKGlucHV0Mi5vcmRlcigpKTsKKyAgICAgICAgICAgIExvbmdCdWZmZXIgcmVzdWx0MiA9IHJlc3VsdC5hc0xvbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGlucHV0Mi5wb3NpdGlvbigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlQ291bnQgLyA4OyBpKyspIHsKKyAgICAgICAgICAgICAgICByZXN1bHQyLnB1dChpbnB1dDIuZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXQyLnBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmltcGxlbWVudGVkIEJ1ZmZlciBzdWJjbGFzcy4iKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQucmV3aW5kKCk7CisgICAgICAgIC8vIFRoZSBPcGVuR0wgQVBJIHdpbGwgaW50ZXJwcmV0IHRoZSByZXN1bHQgaW4gaGFyZHdhcmUgYnl0ZSBvcmRlciwKKyAgICAgICAgLy8gc28gd2UgYmV0dGVyIGRvIHRoYXQgYXMgd2VsbDoKKyAgICAgICAgcmVzdWx0Lm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIGNoYXJbXSB0b0NoYXJJbmRpY2VzKGludCBjb3VudCwgaW50IHR5cGUsIEJ1ZmZlciBpbmRpY2VzKSB7CisgICAgICAgIGNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltjb3VudF07CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6IHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IHRvQnl0ZUJ1ZmZlcihjb3VudCwgaW5kaWNlcyk7CisgICAgICAgICAgICBieXRlW10gYXJyYXkgPSBieXRlQnVmZmVyLmFycmF5KCk7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gYnl0ZUJ1ZmZlci5hcnJheU9mZnNldCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gKGNoYXIpICgweGZmICYgYXJyYXlbb2Zmc2V0ICsgaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVDogeworICAgICAgICAgICAgQ2hhckJ1ZmZlciBjaGFyQnVmZmVyOworICAgICAgICAgICAgaWYgKGluZGljZXMgaW5zdGFuY2VvZiBDaGFyQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgY2hhckJ1ZmZlciA9IChDaGFyQnVmZmVyKSBpbmRpY2VzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSB0b0J5dGVCdWZmZXIoY291bnQgKiAyLCBpbmRpY2VzKTsKKyAgICAgICAgICAgICAgICBjaGFyQnVmZmVyID0gYnl0ZUJ1ZmZlci5hc0NoYXJCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBvbGRQb3NpdGlvbiA9IGNoYXJCdWZmZXIucG9zaXRpb24oKTsKKyAgICAgICAgICAgIGNoYXJCdWZmZXIucG9zaXRpb24oMCk7CisgICAgICAgICAgICBjaGFyQnVmZmVyLmdldChyZXN1bHQpOworICAgICAgICAgICAgY2hhckJ1ZmZlci5wb3NpdGlvbihvbGRQb3NpdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gRG9uJ3QgdGhyb3cgYW4gZXhjZXB0aW9uLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgbG9nZ2luZyB0bworICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBiZWhhdmlvci4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvQXJyYXlFbGVtZW50KFN0cmluZ0J1aWxkZXIgYnVpbGRlciwgYm9vbGVhbiBlbmFibGVkLAorICAgICAgICAgICAgU3RyaW5nIG5hbWUsIFBvaW50ZXJJbmZvIHBvaW50ZXIsIGludCBpbmRleCkgeworICAgICAgICBpZiAoIWVuYWJsZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBidWlsZGVyLmFwcGVuZCgiICIpOworICAgICAgICBidWlsZGVyLmFwcGVuZChuYW1lICsgIjp7Iik7CisgICAgICAgIGlmIChwb2ludGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ1bmRlZmluZWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9pbnRlci5tU3RyaWRlIDwgMCkgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoImludmFsaWQgc3RyaWRlIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgc3RyaWRlID0gcG9pbnRlci5nZXRTdHJpZGUoKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gcG9pbnRlci5tVGVtcEJ5dGVCdWZmZXI7CisgICAgICAgIGludCBzaXplID0gcG9pbnRlci5tU2l6ZTsKKyAgICAgICAgaW50IHR5cGUgPSBwb2ludGVyLm1UeXBlOworICAgICAgICBpbnQgc2l6ZW9mVHlwZSA9IHBvaW50ZXIuc2l6ZW9mKHR5cGUpOworICAgICAgICBpbnQgYnl0ZU9mZnNldCA9IHN0cmlkZSAqIGluZGV4OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgR0xfQllURTogeworICAgICAgICAgICAgICAgIGJ5dGUgZCA9IGJ5dGVCdWZmZXIuZ2V0KGJ5dGVPZmZzZXQpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOiB7CisgICAgICAgICAgICAgICAgYnl0ZSBkID0gYnl0ZUJ1ZmZlci5nZXQoYnl0ZU9mZnNldCk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoSW50ZWdlci50b1N0cmluZygweGZmICYgZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHTF9TSE9SVDogeworICAgICAgICAgICAgICAgIFNob3J0QnVmZmVyIHNob3J0QnVmZmVyID0gYnl0ZUJ1ZmZlci5hc1Nob3J0QnVmZmVyKCk7CisgICAgICAgICAgICAgICAgc2hvcnQgZCA9IHNob3J0QnVmZmVyLmdldChieXRlT2Zmc2V0IC8gMik7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdMX0ZJWEVEOiB7CisgICAgICAgICAgICAgICAgSW50QnVmZmVyIGludEJ1ZmZlciA9IGJ5dGVCdWZmZXIuYXNJbnRCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBpbnQgZCA9IGludEJ1ZmZlci5nZXQoYnl0ZU9mZnNldCAvIDQpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHTF9GTE9BVDogeworICAgICAgICAgICAgICAgIEZsb2F0QnVmZmVyIGludEJ1ZmZlciA9IGJ5dGVCdWZmZXIuYXNGbG9hdEJ1ZmZlcigpOworICAgICAgICAgICAgICAgIGZsb2F0IGQgPSBpbnRCdWZmZXIuZ2V0KGJ5dGVPZmZzZXQgLyA0KTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChGbG9hdC50b1N0cmluZyhkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI/Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlT2Zmc2V0ICs9IHNpemVvZlR5cGU7CisgICAgICAgIH0KKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIn0iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9FbGVtZW50KFN0cmluZ0J1aWxkZXIgYnVpbGRlciwgaW50IG9yZGluYWwsIGludCB2ZXJ0ZXhJbmRleCkgeworICAgICAgICBidWlsZGVyLmFwcGVuZCgiIFsiICsgb3JkaW5hbCArICIgOiAiICsgdmVydGV4SW5kZXggKyAiXSA9Iik7CisgICAgICAgIGRvQXJyYXlFbGVtZW50KGJ1aWxkZXIsIG1WZXJ0ZXhBcnJheUVuYWJsZWQsICJ2IiwgbVZlcnRleFBvaW50ZXIsCisgICAgICAgICAgICAgICAgdmVydGV4SW5kZXgpOworICAgICAgICBkb0FycmF5RWxlbWVudChidWlsZGVyLCBtTm9ybWFsQXJyYXlFbmFibGVkLCAibiIsIG1Ob3JtYWxQb2ludGVyLAorICAgICAgICAgICAgICAgIHZlcnRleEluZGV4KTsKKyAgICAgICAgZG9BcnJheUVsZW1lbnQoYnVpbGRlciwgbUNvbG9yQXJyYXlFbmFibGVkLCAiYyIsIG1Db2xvclBvaW50ZXIsCisgICAgICAgICAgICAgICAgdmVydGV4SW5kZXgpOworICAgICAgICBkb0FycmF5RWxlbWVudChidWlsZGVyLCBtVGV4dHVyZUNvb3JkQXJyYXlFbmFibGVkLCAidCIsCisgICAgICAgICAgICAgICAgbVRleENvb3JkUG9pbnRlciwgdmVydGV4SW5kZXgpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgLy8gVmVydGV4CisgICAgICAgIC8vIE5vcm1hbAorICAgICAgICAvLyBDb2xvcgorICAgICAgICAvLyBUZXhDb29yZAorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBiaW5kQXJyYXlzKCkgeworICAgICAgICBpZiAobUNvbG9yQXJyYXlFbmFibGVkKQorICAgICAgICAgICAgbUNvbG9yUG9pbnRlci5iaW5kQnl0ZUJ1ZmZlcigpOworICAgICAgICBpZiAobU5vcm1hbEFycmF5RW5hYmxlZCkKKyAgICAgICAgICAgIG1Ob3JtYWxQb2ludGVyLmJpbmRCeXRlQnVmZmVyKCk7CisgICAgICAgIGlmIChtVGV4dHVyZUNvb3JkQXJyYXlFbmFibGVkKQorICAgICAgICAgICAgbVRleENvb3JkUG9pbnRlci5iaW5kQnl0ZUJ1ZmZlcigpOworICAgICAgICBpZiAobVZlcnRleEFycmF5RW5hYmxlZCkKKyAgICAgICAgICAgIG1WZXJ0ZXhQb2ludGVyLmJpbmRCeXRlQnVmZmVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVuYmluZEFycmF5cygpIHsKKyAgICAgICAgaWYgKG1Db2xvckFycmF5RW5hYmxlZCkKKyAgICAgICAgICAgIG1Db2xvclBvaW50ZXIudW5iaW5kQnl0ZUJ1ZmZlcigpOworICAgICAgICBpZiAobU5vcm1hbEFycmF5RW5hYmxlZCkKKyAgICAgICAgICAgIG1Ob3JtYWxQb2ludGVyLnVuYmluZEJ5dGVCdWZmZXIoKTsKKyAgICAgICAgaWYgKG1UZXh0dXJlQ29vcmRBcnJheUVuYWJsZWQpCisgICAgICAgICAgICBtVGV4Q29vcmRQb2ludGVyLnVuYmluZEJ5dGVCdWZmZXIoKTsKKyAgICAgICAgaWYgKG1WZXJ0ZXhBcnJheUVuYWJsZWQpCisgICAgICAgICAgICBtVmVydGV4UG9pbnRlci51bmJpbmRCeXRlQnVmZmVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0TG9nSW5kaWNlcygpIHsKKyAgICAgICAgbVN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBtU3RyaW5nQnVpbGRlci5hcHBlbmQoIlxuIik7CisgICAgICAgIGJpbmRBcnJheXMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5kTG9nSW5kaWNlcygpIHsKKyAgICAgICAgbG9nKG1TdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCkpOworICAgICAgICB1bmJpbmRBcnJheXMoKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBHTDEwIG1ldGhvZHM6CisKKyAgICBwdWJsaWMgdm9pZCBnbEFjdGl2ZVRleHR1cmUoaW50IHRleHR1cmUpIHsKKyAgICAgICAgYmVnaW4oImdsQWN0aXZlVGV4dHVyZSIpOworICAgICAgICBhcmcoInRleHR1cmUiLCB0ZXh0dXJlKTsKKyAgICAgICAgZW5kKCk7CisgICAgICAgIG1nbC5nbEFjdGl2ZVRleHR1cmUodGV4dHVyZSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEFscGhhRnVuYyhpbnQgZnVuYywgZmxvYXQgcmVmKSB7CisgICAgICAgIGJlZ2luKCJnbEFscGhhRnVuYyIpOworICAgICAgICBhcmcoImZ1bmMiLCBmdW5jKTsKKyAgICAgICAgYXJnKCJyZWYiLCByZWYpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgbWdsLmdsQWxwaGFGdW5jKGZ1bmMsIHJlZik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEFscGhhRnVuY3goaW50IGZ1bmMsIGludCByZWYpIHsKKyAgICAgICAgYmVnaW4oImdsQWxwaGFGdW5jeCIpOworICAgICAgICBhcmcoImZ1bmMiLCBmdW5jKTsKKyAgICAgICAgYXJnKCJyZWYiLCByZWYpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgbWdsLmdsQWxwaGFGdW5jeChmdW5jLCByZWYpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xCaW5kVGV4dHVyZShpbnQgdGFyZ2V0LCBpbnQgdGV4dHVyZSkgeworICAgICAgICBiZWdpbigiZ2xCaW5kVGV4dHVyZSIpOworICAgICAgICBhcmcoInRhcmdldCIsIGdldFRleHR1cmVUYXJnZXQodGFyZ2V0KSk7CisgICAgICAgIGFyZygidGV4dHVyZSIsIHRleHR1cmUpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgbWdsLmdsQmluZFRleHR1cmUodGFyZ2V0LCB0ZXh0dXJlKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQmxlbmRGdW5jKGludCBzZmFjdG9yLCBpbnQgZGZhY3RvcikgeworICAgICAgICBiZWdpbigiZ2xCbGVuZEZ1bmMiKTsKKyAgICAgICAgYXJnKCJzZmFjdG9yIiwgZ2V0RmFjdG9yKHNmYWN0b3IpKTsKKyAgICAgICAgYXJnKCJkZmFjdG9yIiwgZ2V0RmFjdG9yKGRmYWN0b3IpKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsQmxlbmRGdW5jKHNmYWN0b3IsIGRmYWN0b3IpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDbGVhcihpbnQgbWFzaykgeworICAgICAgICBiZWdpbigiZ2xDbGVhciIpOworICAgICAgICBhcmcoIm1hc2siLCBnZXRDbGVhckJ1ZmZlck1hc2sobWFzaykpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xDbGVhcihtYXNrKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ2xlYXJDb2xvcihmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSkgeworICAgICAgICBiZWdpbigiZ2xDbGVhckNvbG9yIik7CisgICAgICAgIGFyZygicmVkIiwgcmVkKTsKKyAgICAgICAgYXJnKCJncmVlbiIsIGdyZWVuKTsKKyAgICAgICAgYXJnKCJibHVlIiwgYmx1ZSk7CisgICAgICAgIGFyZygiYWxwaGEiLCBhbHBoYSk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbENsZWFyQ29sb3IocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDbGVhckNvbG9yeChpbnQgcmVkLCBpbnQgZ3JlZW4sIGludCBibHVlLCBpbnQgYWxwaGEpIHsKKyAgICAgICAgYmVnaW4oImdsQ2xlYXJDb2xvciIpOworICAgICAgICBhcmcoInJlZCIsIHJlZCk7CisgICAgICAgIGFyZygiZ3JlZW4iLCBncmVlbik7CisgICAgICAgIGFyZygiYmx1ZSIsIGJsdWUpOworICAgICAgICBhcmcoImFscGhhIiwgYWxwaGEpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xDbGVhckNvbG9yeChyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbENsZWFyRGVwdGhmKGZsb2F0IGRlcHRoKSB7CisgICAgICAgIGJlZ2luKCJnbENsZWFyRGVwdGhmIik7CisgICAgICAgIGFyZygiZGVwdGgiLCBkZXB0aCk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbENsZWFyRGVwdGhmKGRlcHRoKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ2xlYXJEZXB0aHgoaW50IGRlcHRoKSB7CisgICAgICAgIGJlZ2luKCJnbENsZWFyRGVwdGh4Iik7CisgICAgICAgIGFyZygiZGVwdGgiLCBkZXB0aCk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbENsZWFyRGVwdGh4KGRlcHRoKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ2xlYXJTdGVuY2lsKGludCBzKSB7CisgICAgICAgIGJlZ2luKCJnbENsZWFyU3RlbmNpbCIpOworICAgICAgICBhcmcoInMiLCBzKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsQ2xlYXJTdGVuY2lsKHMpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDbGllbnRBY3RpdmVUZXh0dXJlKGludCB0ZXh0dXJlKSB7CisgICAgICAgIGJlZ2luKCJnbENsaWVudEFjdGl2ZVRleHR1cmUiKTsKKyAgICAgICAgYXJnKCJ0ZXh0dXJlIiwgdGV4dHVyZSk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbENsaWVudEFjdGl2ZVRleHR1cmUodGV4dHVyZSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbENvbG9yNGYoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpIHsKKyAgICAgICAgYmVnaW4oImdsQ29sb3I0ZiIpOworICAgICAgICBhcmcoInJlZCIsIHJlZCk7CisgICAgICAgIGFyZygiZ3JlZW4iLCBncmVlbik7CisgICAgICAgIGFyZygiYmx1ZSIsIGJsdWUpOworICAgICAgICBhcmcoImFscGhhIiwgYWxwaGEpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xDb2xvcjRmKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ29sb3I0eChpbnQgcmVkLCBpbnQgZ3JlZW4sIGludCBibHVlLCBpbnQgYWxwaGEpIHsKKyAgICAgICAgYmVnaW4oImdsQ29sb3I0eCIpOworICAgICAgICBhcmcoInJlZCIsIHJlZCk7CisgICAgICAgIGFyZygiZ3JlZW4iLCBncmVlbik7CisgICAgICAgIGFyZygiYmx1ZSIsIGJsdWUpOworICAgICAgICBhcmcoImFscGhhIiwgYWxwaGEpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xDb2xvcjR4KHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ29sb3JNYXNrKGJvb2xlYW4gcmVkLCBib29sZWFuIGdyZWVuLCBib29sZWFuIGJsdWUsCisgICAgICAgICAgICBib29sZWFuIGFscGhhKSB7CisgICAgICAgIGJlZ2luKCJnbENvbG9yTWFzayIpOworICAgICAgICBhcmcoInJlZCIsIHJlZCk7CisgICAgICAgIGFyZygiZ3JlZW4iLCBncmVlbik7CisgICAgICAgIGFyZygiYmx1ZSIsIGJsdWUpOworICAgICAgICBhcmcoImFscGhhIiwgYWxwaGEpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xDb2xvck1hc2socmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDb2xvclBvaW50ZXIoaW50IHNpemUsIGludCB0eXBlLCBpbnQgc3RyaWRlLCBCdWZmZXIgcG9pbnRlcikgeworICAgICAgICBiZWdpbigiZ2xDb2xvclBvaW50ZXIiKTsKKyAgICAgICAgYXJnUG9pbnRlcihzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgbUNvbG9yUG9pbnRlciA9IG5ldyBQb2ludGVySW5mbyhzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOworCisgICAgICAgIG1nbC5nbENvbG9yUG9pbnRlcihzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsCisgICAgICAgICAgICBpbnQgaW50ZXJuYWxmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJvcmRlciwKKyAgICAgICAgICAgIGludCBpbWFnZVNpemUsIEJ1ZmZlciBkYXRhKSB7CisgICAgICAgIGJlZ2luKCJnbENvbXByZXNzZWRUZXhJbWFnZTJEIik7CisgICAgICAgIGFyZygidGFyZ2V0IiwgZ2V0VGV4dHVyZVRhcmdldCh0YXJnZXQpKTsKKyAgICAgICAgYXJnKCJsZXZlbCIsIGxldmVsKTsKKyAgICAgICAgYXJnKCJpbnRlcm5hbGZvcm1hdCIsIGludGVybmFsZm9ybWF0KTsKKyAgICAgICAgYXJnKCJ3aWR0aCIsIHdpZHRoKTsKKyAgICAgICAgYXJnKCJoZWlnaHQiLCBoZWlnaHQpOworICAgICAgICBhcmcoImJvcmRlciIsIGJvcmRlcik7CisgICAgICAgIGFyZygiaW1hZ2VTaXplIiwgaW1hZ2VTaXplKTsKKyAgICAgICAgYXJnKCJkYXRhIiwgZGF0YS50b1N0cmluZygpKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsQ29tcHJlc3NlZFRleEltYWdlMkQodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLAorICAgICAgICAgICAgICAgIGhlaWdodCwgYm9yZGVyLCBpbWFnZVNpemUsIGRhdGEpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCB4b2Zmc2V0LAorICAgICAgICAgICAgaW50IHlvZmZzZXQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwgaW50IGltYWdlU2l6ZSwKKyAgICAgICAgICAgIEJ1ZmZlciBkYXRhKSB7CisgICAgICAgIGJlZ2luKCJnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEIik7CisgICAgICAgIGFyZygidGFyZ2V0IiwgZ2V0VGV4dHVyZVRhcmdldCh0YXJnZXQpKTsKKyAgICAgICAgYXJnKCJsZXZlbCIsIGxldmVsKTsKKyAgICAgICAgYXJnKCJ4b2Zmc2V0IiwgeG9mZnNldCk7CisgICAgICAgIGFyZygieW9mZnNldCIsIHlvZmZzZXQpOworICAgICAgICBhcmcoIndpZHRoIiwgd2lkdGgpOworICAgICAgICBhcmcoImhlaWdodCIsIGhlaWdodCk7CisgICAgICAgIGFyZygiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICAgICAgYXJnKCJpbWFnZVNpemUiLCBpbWFnZVNpemUpOworICAgICAgICBhcmcoImRhdGEiLCBkYXRhLnRvU3RyaW5nKCkpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwKKyAgICAgICAgICAgICAgICBoZWlnaHQsIGZvcm1hdCwgaW1hZ2VTaXplLCBkYXRhKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ29weVRleEltYWdlMkQoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgaW50ZXJuYWxmb3JtYXQsCisgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJvcmRlcikgeworICAgICAgICBiZWdpbigiZ2xDb3B5VGV4SW1hZ2UyRCIpOworICAgICAgICBhcmcoInRhcmdldCIsIGdldFRleHR1cmVUYXJnZXQodGFyZ2V0KSk7CisgICAgICAgIGFyZygibGV2ZWwiLCBsZXZlbCk7CisgICAgICAgIGFyZygiaW50ZXJuYWxmb3JtYXQiLCBpbnRlcm5hbGZvcm1hdCk7CisgICAgICAgIGFyZygieCIsIHgpOworICAgICAgICBhcmcoInkiLCB5KTsKKyAgICAgICAgYXJnKCJ3aWR0aCIsIHdpZHRoKTsKKyAgICAgICAgYXJnKCJoZWlnaHQiLCBoZWlnaHQpOworICAgICAgICBhcmcoImJvcmRlciIsIGJvcmRlcik7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbENvcHlUZXhJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5LCB3aWR0aCwKKyAgICAgICAgICAgICAgICBoZWlnaHQsIGJvcmRlcik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbENvcHlUZXhTdWJJbWFnZTJEKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IHhvZmZzZXQsCisgICAgICAgICAgICBpbnQgeW9mZnNldCwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgYmVnaW4oImdsQ29weVRleFN1YkltYWdlMkQiKTsKKyAgICAgICAgYXJnKCJ0YXJnZXQiLCBnZXRUZXh0dXJlVGFyZ2V0KHRhcmdldCkpOworICAgICAgICBhcmcoImxldmVsIiwgbGV2ZWwpOworICAgICAgICBhcmcoInhvZmZzZXQiLCB4b2Zmc2V0KTsKKyAgICAgICAgYXJnKCJ5b2Zmc2V0IiwgeW9mZnNldCk7CisgICAgICAgIGFyZygieCIsIHgpOworICAgICAgICBhcmcoInkiLCB5KTsKKyAgICAgICAgYXJnKCJ3aWR0aCIsIHdpZHRoKTsKKyAgICAgICAgYXJnKCJoZWlnaHQiLCBoZWlnaHQpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xDb3B5VGV4U3ViSW1hZ2UyRCh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB4LCB5LCB3aWR0aCwKKyAgICAgICAgICAgICAgICBoZWlnaHQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDdWxsRmFjZShpbnQgbW9kZSkgeworICAgICAgICBiZWdpbigiZ2xDdWxsRmFjZSIpOworICAgICAgICBhcmcoIm1vZGUiLCBtb2RlKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsQ3VsbEZhY2UobW9kZSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERlbGV0ZVRleHR1cmVzKGludCBuLCBpbnRbXSB0ZXh0dXJlcywgaW50IG9mZnNldCkgeworICAgICAgICBiZWdpbigiZ2xEZWxldGVUZXh0dXJlcyIpOworICAgICAgICBhcmcoIm4iLCBuKTsKKyAgICAgICAgYXJnKCJ0ZXh0dXJlcyIsIG4sIHRleHR1cmVzLCBvZmZzZXQpOworICAgICAgICBhcmcoIm9mZnNldCIsIG9mZnNldCk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbERlbGV0ZVRleHR1cmVzKG4sIHRleHR1cmVzLCBvZmZzZXQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEZWxldGVUZXh0dXJlcyhpbnQgbiwgSW50QnVmZmVyIHRleHR1cmVzKSB7CisgICAgICAgIGJlZ2luKCJnbERlbGV0ZVRleHR1cmVzIik7CisgICAgICAgIGFyZygibiIsIG4pOworICAgICAgICBhcmcoInRleHR1cmVzIiwgbiwgdGV4dHVyZXMpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xEZWxldGVUZXh0dXJlcyhuLCB0ZXh0dXJlcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERlcHRoRnVuYyhpbnQgZnVuYykgeworICAgICAgICBiZWdpbigiZ2xEZXB0aEZ1bmMiKTsKKyAgICAgICAgYXJnKCJmdW5jIiwgZnVuYyk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbERlcHRoRnVuYyhmdW5jKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRGVwdGhNYXNrKGJvb2xlYW4gZmxhZykgeworICAgICAgICBiZWdpbigiZ2xEZXB0aE1hc2siKTsKKyAgICAgICAgYXJnKCJmbGFnIiwgZmxhZyk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbERlcHRoTWFzayhmbGFnKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRGVwdGhSYW5nZWYoZmxvYXQgbmVhciwgZmxvYXQgZmFyKSB7CisgICAgICAgIGJlZ2luKCJnbERlcHRoUmFuZ2VmIik7CisgICAgICAgIGFyZygibmVhciIsIG5lYXIpOworICAgICAgICBhcmcoImZhciIsIGZhcik7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbERlcHRoUmFuZ2VmKG5lYXIsIGZhcik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERlcHRoUmFuZ2V4KGludCBuZWFyLCBpbnQgZmFyKSB7CisgICAgICAgIGJlZ2luKCJnbERlcHRoUmFuZ2V4Iik7CisgICAgICAgIGFyZygibmVhciIsIG5lYXIpOworICAgICAgICBhcmcoImZhciIsIGZhcik7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbERlcHRoUmFuZ2V4KG5lYXIsIGZhcik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERpc2FibGUoaW50IGNhcCkgeworICAgICAgICBiZWdpbigiZ2xEaXNhYmxlIik7CisgICAgICAgIGFyZygiY2FwIiwgZ2V0Q2FwKGNhcCkpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xEaXNhYmxlKGNhcCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERpc2FibGVDbGllbnRTdGF0ZShpbnQgYXJyYXkpIHsKKyAgICAgICAgYmVnaW4oImdsRGlzYWJsZUNsaWVudFN0YXRlIik7CisgICAgICAgIGFyZygiYXJyYXkiLCBnZXRDbGllbnRTdGF0ZShhcnJheSkpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBzd2l0Y2ggKGFycmF5KSB7CisgICAgICAgIGNhc2UgR0xfQ09MT1JfQVJSQVk6CisgICAgICAgICAgICBtQ29sb3JBcnJheUVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX05PUk1BTF9BUlJBWToKKyAgICAgICAgICAgIG1Ob3JtYWxBcnJheUVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVk6CisgICAgICAgICAgICBtVGV4dHVyZUNvb3JkQXJyYXlFbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9WRVJURVhfQVJSQVk6CisgICAgICAgICAgICBtVmVydGV4QXJyYXlFbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtZ2wuZ2xEaXNhYmxlQ2xpZW50U3RhdGUoYXJyYXkpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEcmF3QXJyYXlzKGludCBtb2RlLCBpbnQgZmlyc3QsIGludCBjb3VudCkgeworICAgICAgICBiZWdpbigiZ2xEcmF3QXJyYXlzIik7CisgICAgICAgIGFyZygibW9kZSIsIG1vZGUpOworICAgICAgICBhcmcoImZpcnN0IiwgZmlyc3QpOworICAgICAgICBhcmcoImNvdW50IiwgY291bnQpOworICAgICAgICBzdGFydExvZ0luZGljZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBkb0VsZW1lbnQobVN0cmluZ0J1aWxkZXIsIGksIGZpcnN0ICsgY291bnQpOworICAgICAgICB9CisgICAgICAgIGVuZExvZ0luZGljZXMoKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsRHJhd0FycmF5cyhtb2RlLCBmaXJzdCwgY291bnQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEcmF3RWxlbWVudHMoaW50IG1vZGUsIGludCBjb3VudCwgaW50IHR5cGUsIEJ1ZmZlciBpbmRpY2VzKSB7CisgICAgICAgIGJlZ2luKCJnbERyYXdFbGVtZW50cyIpOworICAgICAgICBhcmcoIm1vZGUiLCBnZXRCZWdpbk1vZGUobW9kZSkpOworICAgICAgICBhcmcoImNvdW50IiwgY291bnQpOworICAgICAgICBhcmcoInR5cGUiLCBnZXRJbmRleFR5cGUodHlwZSkpOworICAgICAgICBjaGFyW10gaW5kZXhBcnJheSA9IHRvQ2hhckluZGljZXMoY291bnQsIHR5cGUsIGluZGljZXMpOworICAgICAgICBpbnQgaW5kZXhBcnJheUxlbmd0aCA9IGluZGV4QXJyYXkubGVuZ3RoOworICAgICAgICBzdGFydExvZ0luZGljZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleEFycmF5TGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGRvRWxlbWVudChtU3RyaW5nQnVpbGRlciwgaSwgaW5kZXhBcnJheVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgZW5kTG9nSW5kaWNlcygpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xEcmF3RWxlbWVudHMobW9kZSwgY291bnQsIHR5cGUsIGluZGljZXMpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xFbmFibGUoaW50IGNhcCkgeworICAgICAgICBiZWdpbigiZ2xFbmFibGUiKTsKKyAgICAgICAgYXJnKCJjYXAiLCBnZXRDYXAoY2FwKSk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbEVuYWJsZShjYXApOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xFbmFibGVDbGllbnRTdGF0ZShpbnQgYXJyYXkpIHsKKyAgICAgICAgYmVnaW4oImdsRW5hYmxlQ2xpZW50U3RhdGUiKTsKKyAgICAgICAgYXJnKCJhcnJheSIsIGdldENsaWVudFN0YXRlKGFycmF5KSk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIHN3aXRjaCAoYXJyYXkpIHsKKyAgICAgICAgY2FzZSBHTF9DT0xPUl9BUlJBWToKKyAgICAgICAgICAgIG1Db2xvckFycmF5RW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9OT1JNQUxfQVJSQVk6CisgICAgICAgICAgICBtTm9ybWFsQXJyYXlFbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVk6CisgICAgICAgICAgICBtVGV4dHVyZUNvb3JkQXJyYXlFbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BUlJBWToKKyAgICAgICAgICAgIG1WZXJ0ZXhBcnJheUVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbWdsLmdsRW5hYmxlQ2xpZW50U3RhdGUoYXJyYXkpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xGaW5pc2goKSB7CisgICAgICAgIGJlZ2luKCJnbEZpbmlzaCIpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xGaW5pc2goKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRmx1c2goKSB7CisgICAgICAgIGJlZ2luKCJnbEZsdXNoIik7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbEZsdXNoKCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEZvZ2YoaW50IHBuYW1lLCBmbG9hdCBwYXJhbSkgeworICAgICAgICBiZWdpbigiZ2xGb2dmIik7CisgICAgICAgIGFyZygicG5hbWUiLCBwbmFtZSk7CisgICAgICAgIGFyZygicGFyYW0iLCBwYXJhbSk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbEZvZ2YocG5hbWUsIHBhcmFtKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRm9nZnYoaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICBiZWdpbigiZ2xGb2dmdiIpOworICAgICAgICBhcmcoInBuYW1lIiwgZ2V0Rm9nUE5hbWUocG5hbWUpKTsKKyAgICAgICAgYXJnKCJwYXJhbXMiLCBnZXRGb2dQYXJhbUNvdW50KHBuYW1lKSwgcGFyYW1zLCBvZmZzZXQpOworICAgICAgICBhcmcoIm9mZnNldCIsIG9mZnNldCk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbEZvZ2Z2KHBuYW1lLCBwYXJhbXMsIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEZvZ2Z2KGludCBwbmFtZSwgRmxvYXRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIGJlZ2luKCJnbEZvZ2Z2Iik7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRGb2dQTmFtZShwbmFtZSkpOworICAgICAgICBhcmcoInBhcmFtcyIsIGdldEZvZ1BhcmFtQ291bnQocG5hbWUpLCBwYXJhbXMpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xGb2dmdihwbmFtZSwgcGFyYW1zKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRm9neChpbnQgcG5hbWUsIGludCBwYXJhbSkgeworICAgICAgICBiZWdpbigiZ2xGb2d4Iik7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRGb2dQTmFtZShwbmFtZSkpOworICAgICAgICBhcmcoInBhcmFtIiwgcGFyYW0pOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xGb2d4KHBuYW1lLCBwYXJhbSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEZvZ3h2KGludCBwbmFtZSwgaW50W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGJlZ2luKCJnbEZvZ3h2Iik7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRGb2dQTmFtZShwbmFtZSkpOworICAgICAgICBhcmcoInBhcmFtcyIsIGdldEZvZ1BhcmFtQ291bnQocG5hbWUpLCBwYXJhbXMsIG9mZnNldCk7CisgICAgICAgIGFyZygib2Zmc2V0Iiwgb2Zmc2V0KTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsRm9neHYocG5hbWUsIHBhcmFtcywgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRm9neHYoaW50IHBuYW1lLCBJbnRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIGJlZ2luKCJnbEZvZ3h2Iik7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRGb2dQTmFtZShwbmFtZSkpOworICAgICAgICBhcmcoInBhcmFtcyIsIGdldEZvZ1BhcmFtQ291bnQocG5hbWUpLCBwYXJhbXMpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xGb2d4dihwbmFtZSwgcGFyYW1zKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRnJvbnRGYWNlKGludCBtb2RlKSB7CisgICAgICAgIGJlZ2luKCJnbEZyb250RmFjZSIpOworICAgICAgICBhcmcoIm1vZGUiLCBtb2RlKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsRnJvbnRGYWNlKG1vZGUpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xGcnVzdHVtZihmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsCisgICAgICAgICAgICBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICAgICAgYmVnaW4oImdsRnJ1c3R1bWYiKTsKKyAgICAgICAgYXJnKCJsZWZ0IiwgbGVmdCk7CisgICAgICAgIGFyZygicmlnaHQiLCByaWdodCk7CisgICAgICAgIGFyZygiYm90dG9tIiwgYm90dG9tKTsKKyAgICAgICAgYXJnKCJ0b3AiLCB0b3ApOworICAgICAgICBhcmcoIm5lYXIiLCBuZWFyKTsKKyAgICAgICAgYXJnKCJmYXIiLCBmYXIpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xGcnVzdHVtZihsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEZydXN0dW14KGludCBsZWZ0LCBpbnQgcmlnaHQsIGludCBib3R0b20sIGludCB0b3AsIGludCBuZWFyLAorICAgICAgICAgICAgaW50IGZhcikgeworICAgICAgICBiZWdpbigiZ2xGcnVzdHVteCIpOworICAgICAgICBhcmcoImxlZnQiLCBsZWZ0KTsKKyAgICAgICAgYXJnKCJyaWdodCIsIHJpZ2h0KTsKKyAgICAgICAgYXJnKCJib3R0b20iLCBib3R0b20pOworICAgICAgICBhcmcoInRvcCIsIHRvcCk7CisgICAgICAgIGFyZygibmVhciIsIG5lYXIpOworICAgICAgICBhcmcoImZhciIsIGZhcik7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbEZydXN0dW14KGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2VuVGV4dHVyZXMoaW50IG4sIGludFtdIHRleHR1cmVzLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGJlZ2luKCJnbEdlblRleHR1cmVzIik7CisgICAgICAgIGFyZygibiIsIG4pOworICAgICAgICBhcmcoInRleHR1cmVzIiwgQXJyYXlzLnRvU3RyaW5nKHRleHR1cmVzKSk7CisgICAgICAgIGFyZygib2Zmc2V0Iiwgb2Zmc2V0KTsKKworICAgICAgICBtZ2wuZ2xHZW5UZXh0dXJlcyhuLCB0ZXh0dXJlcywgb2Zmc2V0KTsKKworICAgICAgICByZXR1cm5zKHRvU3RyaW5nKG4sIEZPUk1BVF9JTlQsIHRleHR1cmVzLCBvZmZzZXQpKTsKKworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZW5UZXh0dXJlcyhpbnQgbiwgSW50QnVmZmVyIHRleHR1cmVzKSB7CisgICAgICAgIGJlZ2luKCJnbEdlblRleHR1cmVzIik7CisgICAgICAgIGFyZygibiIsIG4pOworICAgICAgICBhcmcoInRleHR1cmVzIiwgdGV4dHVyZXMudG9TdHJpbmcoKSk7CisKKyAgICAgICAgbWdsLmdsR2VuVGV4dHVyZXMobiwgdGV4dHVyZXMpOworCisgICAgICAgIHJldHVybnModG9TdHJpbmcobiwgRk9STUFUX0lOVCwgdGV4dHVyZXMpKTsKKworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnbEdldEVycm9yKCkgeworICAgICAgICBiZWdpbigiZ2xHZXRFcnJvciIpOworCisgICAgICAgIGludCByZXN1bHQgPSBtZ2wuZ2xHZXRFcnJvcigpOworCisgICAgICAgIHJldHVybnMocmVzdWx0KTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0SW50ZWdlcnYoaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgYmVnaW4oImdsR2V0SW50ZWdlcnYiKTsKKyAgICAgICAgYXJnKCJwbmFtZSIsIGdldEludGVnZXJTdGF0ZU5hbWUocG5hbWUpKTsKKyAgICAgICAgYXJnKCJwYXJhbXMiLCBBcnJheXMudG9TdHJpbmcocGFyYW1zKSk7CisgICAgICAgIGFyZygib2Zmc2V0Iiwgb2Zmc2V0KTsKKworICAgICAgICBtZ2wuZ2xHZXRJbnRlZ2VydihwbmFtZSwgcGFyYW1zLCBvZmZzZXQpOworCisgICAgICAgIHJldHVybnModG9TdHJpbmcoZ2V0SW50ZWdlclN0YXRlU2l6ZShwbmFtZSksCisgICAgICAgICAgICAgICAgZ2V0SW50ZWdlclN0YXRlRm9ybWF0KHBuYW1lKSwgcGFyYW1zLCBvZmZzZXQpKTsKKworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRJbnRlZ2VydihpbnQgcG5hbWUsIEludEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgYmVnaW4oImdsR2V0SW50ZWdlcnYiKTsKKyAgICAgICAgYXJnKCJwbmFtZSIsIGdldEludGVnZXJTdGF0ZU5hbWUocG5hbWUpKTsKKyAgICAgICAgYXJnKCJwYXJhbXMiLCBwYXJhbXMudG9TdHJpbmcoKSk7CisKKyAgICAgICAgbWdsLmdsR2V0SW50ZWdlcnYocG5hbWUsIHBhcmFtcyk7CisKKyAgICAgICAgcmV0dXJucyh0b1N0cmluZyhnZXRJbnRlZ2VyU3RhdGVTaXplKHBuYW1lKSwKKyAgICAgICAgICAgICAgICBnZXRJbnRlZ2VyU3RhdGVGb3JtYXQocG5hbWUpLCBwYXJhbXMpKTsKKworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnbEdldFN0cmluZyhpbnQgbmFtZSkgeworICAgICAgICBiZWdpbigiZ2xHZXRTdHJpbmciKTsKKyAgICAgICAgYXJnKCJuYW1lIiwgbmFtZSk7CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG1nbC5nbEdldFN0cmluZyhuYW1lKTsKKworICAgICAgICByZXR1cm5zKHJlc3VsdCk7CisKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsSGludChpbnQgdGFyZ2V0LCBpbnQgbW9kZSkgeworICAgICAgICBiZWdpbigiZ2xIaW50Iik7CisgICAgICAgIGFyZygidGFyZ2V0IiwgZ2V0SGludFRhcmdldCh0YXJnZXQpKTsKKyAgICAgICAgYXJnKCJtb2RlIiwgZ2V0SGludE1vZGUobW9kZSkpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xIaW50KHRhcmdldCwgbW9kZSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExpZ2h0TW9kZWxmKGludCBwbmFtZSwgZmxvYXQgcGFyYW0pIHsKKyAgICAgICAgYmVnaW4oImdsTGlnaHRNb2RlbGYiKTsKKyAgICAgICAgYXJnKCJwbmFtZSIsIGdldExpZ2h0TW9kZWxQTmFtZShwbmFtZSkpOworICAgICAgICBhcmcoInBhcmFtIiwgcGFyYW0pOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xMaWdodE1vZGVsZihwbmFtZSwgcGFyYW0pOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xMaWdodE1vZGVsZnYoaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICBiZWdpbigiZ2xMaWdodE1vZGVsZnYiKTsKKyAgICAgICAgYXJnKCJwbmFtZSIsIGdldExpZ2h0TW9kZWxQTmFtZShwbmFtZSkpOworICAgICAgICBhcmcoInBhcmFtcyIsIGdldExpZ2h0TW9kZWxQYXJhbUNvdW50KHBuYW1lKSwgcGFyYW1zLCBvZmZzZXQpOworICAgICAgICBhcmcoIm9mZnNldCIsIG9mZnNldCk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbExpZ2h0TW9kZWxmdihwbmFtZSwgcGFyYW1zLCBvZmZzZXQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xMaWdodE1vZGVsZnYoaW50IHBuYW1lLCBGbG9hdEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgYmVnaW4oImdsTGlnaHRNb2RlbGZ2Iik7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRMaWdodE1vZGVsUE5hbWUocG5hbWUpKTsKKyAgICAgICAgYXJnKCJwYXJhbXMiLCBnZXRMaWdodE1vZGVsUGFyYW1Db3VudChwbmFtZSksIHBhcmFtcyk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbExpZ2h0TW9kZWxmdihwbmFtZSwgcGFyYW1zKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTGlnaHRNb2RlbHgoaW50IHBuYW1lLCBpbnQgcGFyYW0pIHsKKyAgICAgICAgYmVnaW4oImdsTGlnaHRNb2RlbHgiKTsKKyAgICAgICAgYXJnKCJwbmFtZSIsIGdldExpZ2h0TW9kZWxQTmFtZShwbmFtZSkpOworICAgICAgICBhcmcoInBhcmFtIiwgcGFyYW0pOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xMaWdodE1vZGVseChwbmFtZSwgcGFyYW0pOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xMaWdodE1vZGVseHYoaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgYmVnaW4oImdsTGlnaHRNb2RlbHh2Iik7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRMaWdodE1vZGVsUE5hbWUocG5hbWUpKTsKKyAgICAgICAgYXJnKCJwYXJhbXMiLCBnZXRMaWdodE1vZGVsUGFyYW1Db3VudChwbmFtZSksIHBhcmFtcywgb2Zmc2V0KTsKKyAgICAgICAgYXJnKCJvZmZzZXQiLCBvZmZzZXQpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xMaWdodE1vZGVseHYocG5hbWUsIHBhcmFtcywgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTGlnaHRNb2RlbHh2KGludCBwbmFtZSwgSW50QnVmZmVyIHBhcmFtcykgeworICAgICAgICBiZWdpbigiZ2xMaWdodE1vZGVsZnYiKTsKKyAgICAgICAgYXJnKCJwbmFtZSIsIGdldExpZ2h0TW9kZWxQTmFtZShwbmFtZSkpOworICAgICAgICBhcmcoInBhcmFtcyIsIGdldExpZ2h0TW9kZWxQYXJhbUNvdW50KHBuYW1lKSwgcGFyYW1zKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsTGlnaHRNb2RlbHh2KHBuYW1lLCBwYXJhbXMpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xMaWdodGYoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGZsb2F0IHBhcmFtKSB7CisgICAgICAgIGJlZ2luKCJnbExpZ2h0ZiIpOworICAgICAgICBhcmcoImxpZ2h0IiwgZ2V0TGlnaHROYW1lKGxpZ2h0KSk7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRMaWdodFBOYW1lKHBuYW1lKSk7CisgICAgICAgIGFyZygicGFyYW0iLCBwYXJhbSk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbExpZ2h0ZihsaWdodCwgcG5hbWUsIHBhcmFtKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTGlnaHRmdihpbnQgbGlnaHQsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgYmVnaW4oImdsTGlnaHRmdiIpOworICAgICAgICBhcmcoImxpZ2h0IiwgZ2V0TGlnaHROYW1lKGxpZ2h0KSk7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRMaWdodFBOYW1lKHBuYW1lKSk7CisgICAgICAgIGFyZygicGFyYW1zIiwgZ2V0TGlnaHRQYXJhbUNvdW50KHBuYW1lKSwgcGFyYW1zLCBvZmZzZXQpOworICAgICAgICBhcmcoIm9mZnNldCIsIG9mZnNldCk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbExpZ2h0ZnYobGlnaHQsIHBuYW1lLCBwYXJhbXMsIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExpZ2h0ZnYoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIEZsb2F0QnVmZmVyIHBhcmFtcykgeworICAgICAgICBiZWdpbigiZ2xMaWdodGZ2Iik7CisgICAgICAgIGFyZygibGlnaHQiLCBnZXRMaWdodE5hbWUobGlnaHQpKTsKKyAgICAgICAgYXJnKCJwbmFtZSIsIGdldExpZ2h0UE5hbWUocG5hbWUpKTsKKyAgICAgICAgYXJnKCJwYXJhbXMiLCBnZXRMaWdodFBhcmFtQ291bnQocG5hbWUpLCBwYXJhbXMpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xMaWdodGZ2KGxpZ2h0LCBwbmFtZSwgcGFyYW1zKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTGlnaHR4KGludCBsaWdodCwgaW50IHBuYW1lLCBpbnQgcGFyYW0pIHsKKyAgICAgICAgYmVnaW4oImdsTGlnaHR4Iik7CisgICAgICAgIGFyZygibGlnaHQiLCBnZXRMaWdodE5hbWUobGlnaHQpKTsKKyAgICAgICAgYXJnKCJwbmFtZSIsIGdldExpZ2h0UE5hbWUocG5hbWUpKTsKKyAgICAgICAgYXJnKCJwYXJhbSIsIHBhcmFtKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsTGlnaHR4KGxpZ2h0LCBwbmFtZSwgcGFyYW0pOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xMaWdodHh2KGludCBsaWdodCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgYmVnaW4oImdsTGlnaHR4diIpOworICAgICAgICBhcmcoImxpZ2h0IiwgZ2V0TGlnaHROYW1lKGxpZ2h0KSk7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRMaWdodFBOYW1lKHBuYW1lKSk7CisgICAgICAgIGFyZygicGFyYW1zIiwgZ2V0TGlnaHRQYXJhbUNvdW50KHBuYW1lKSwgcGFyYW1zLCBvZmZzZXQpOworICAgICAgICBhcmcoIm9mZnNldCIsIG9mZnNldCk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbExpZ2h0eHYobGlnaHQsIHBuYW1lLCBwYXJhbXMsIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExpZ2h0eHYoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIEludEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgYmVnaW4oImdsTGlnaHR4diIpOworICAgICAgICBhcmcoImxpZ2h0IiwgZ2V0TGlnaHROYW1lKGxpZ2h0KSk7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRMaWdodFBOYW1lKHBuYW1lKSk7CisgICAgICAgIGFyZygicGFyYW1zIiwgZ2V0TGlnaHRQYXJhbUNvdW50KHBuYW1lKSwgcGFyYW1zKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsTGlnaHR4dihsaWdodCwgcG5hbWUsIHBhcmFtcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExpbmVXaWR0aChmbG9hdCB3aWR0aCkgeworICAgICAgICBiZWdpbigiZ2xMaW5lV2lkdGgiKTsKKyAgICAgICAgYXJnKCJ3aWR0aCIsIHdpZHRoKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsTGluZVdpZHRoKHdpZHRoKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTGluZVdpZHRoeChpbnQgd2lkdGgpIHsKKyAgICAgICAgYmVnaW4oImdsTGluZVdpZHRoeCIpOworICAgICAgICBhcmcoIndpZHRoIiwgd2lkdGgpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xMaW5lV2lkdGh4KHdpZHRoKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTG9hZElkZW50aXR5KCkgeworICAgICAgICBiZWdpbigiZ2xMb2FkSWRlbnRpdHkiKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsTG9hZElkZW50aXR5KCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExvYWRNYXRyaXhmKGZsb2F0W10gbSwgaW50IG9mZnNldCkgeworICAgICAgICBiZWdpbigiZ2xMb2FkTWF0cml4ZiIpOworICAgICAgICBhcmcoIm0iLCAxNiwgbSwgb2Zmc2V0KTsKKyAgICAgICAgYXJnKCJvZmZzZXQiLCBvZmZzZXQpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xMb2FkTWF0cml4ZihtLCBvZmZzZXQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xMb2FkTWF0cml4ZihGbG9hdEJ1ZmZlciBtKSB7CisgICAgICAgIGJlZ2luKCJnbExvYWRNYXRyaXhmIik7CisgICAgICAgIGFyZygibSIsIDE2LCBtKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsTG9hZE1hdHJpeGYobSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExvYWRNYXRyaXh4KGludFtdIG0sIGludCBvZmZzZXQpIHsKKyAgICAgICAgYmVnaW4oImdsTG9hZE1hdHJpeHgiKTsKKyAgICAgICAgYXJnKCJtIiwgMTYsIG0sIG9mZnNldCk7CisgICAgICAgIGFyZygib2Zmc2V0Iiwgb2Zmc2V0KTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsTG9hZE1hdHJpeHgobSwgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTG9hZE1hdHJpeHgoSW50QnVmZmVyIG0pIHsKKyAgICAgICAgYmVnaW4oImdsTG9hZE1hdHJpeHgiKTsKKyAgICAgICAgYXJnKCJtIiwgMTYsIG0pOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xMb2FkTWF0cml4eChtKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTG9naWNPcChpbnQgb3Bjb2RlKSB7CisgICAgICAgIGJlZ2luKCJnbExvZ2ljT3AiKTsKKyAgICAgICAgYXJnKCJvcGNvZGUiLCBvcGNvZGUpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xMb2dpY09wKG9wY29kZSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbE1hdGVyaWFsZihpbnQgZmFjZSwgaW50IHBuYW1lLCBmbG9hdCBwYXJhbSkgeworICAgICAgICBiZWdpbigiZ2xNYXRlcmlhbGYiKTsKKyAgICAgICAgYXJnKCJmYWNlIiwgZ2V0RmFjZU5hbWUoZmFjZSkpOworICAgICAgICBhcmcoInBuYW1lIiwgZ2V0TWF0ZXJpYWxQTmFtZShwbmFtZSkpOworICAgICAgICBhcmcoInBhcmFtIiwgcGFyYW0pOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xNYXRlcmlhbGYoZmFjZSwgcG5hbWUsIHBhcmFtKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTWF0ZXJpYWxmdihpbnQgZmFjZSwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICBiZWdpbigiZ2xNYXRlcmlhbGZ2Iik7CisgICAgICAgIGFyZygiZmFjZSIsIGdldEZhY2VOYW1lKGZhY2UpKTsKKyAgICAgICAgYXJnKCJwbmFtZSIsIGdldE1hdGVyaWFsUE5hbWUocG5hbWUpKTsKKyAgICAgICAgYXJnKCJwYXJhbXMiLCBnZXRNYXRlcmlhbFBhcmFtQ291bnQocG5hbWUpLCBwYXJhbXMsIG9mZnNldCk7CisgICAgICAgIGFyZygib2Zmc2V0Iiwgb2Zmc2V0KTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsTWF0ZXJpYWxmdihmYWNlLCBwbmFtZSwgcGFyYW1zLCBvZmZzZXQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xNYXRlcmlhbGZ2KGludCBmYWNlLCBpbnQgcG5hbWUsIEZsb2F0QnVmZmVyIHBhcmFtcykgeworICAgICAgICBiZWdpbigiZ2xNYXRlcmlhbGZ2Iik7CisgICAgICAgIGFyZygiZmFjZSIsIGdldEZhY2VOYW1lKGZhY2UpKTsKKyAgICAgICAgYXJnKCJwbmFtZSIsIGdldE1hdGVyaWFsUE5hbWUocG5hbWUpKTsKKyAgICAgICAgYXJnKCJwYXJhbXMiLCBnZXRNYXRlcmlhbFBhcmFtQ291bnQocG5hbWUpLCBwYXJhbXMpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xNYXRlcmlhbGZ2KGZhY2UsIHBuYW1lLCBwYXJhbXMpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xNYXRlcmlhbHgoaW50IGZhY2UsIGludCBwbmFtZSwgaW50IHBhcmFtKSB7CisgICAgICAgIGJlZ2luKCJnbE1hdGVyaWFseCIpOworICAgICAgICBhcmcoImZhY2UiLCBnZXRGYWNlTmFtZShmYWNlKSk7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRNYXRlcmlhbFBOYW1lKHBuYW1lKSk7CisgICAgICAgIGFyZygicGFyYW0iLCBwYXJhbSk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbE1hdGVyaWFseChmYWNlLCBwbmFtZSwgcGFyYW0pOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xNYXRlcmlhbHh2KGludCBmYWNlLCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICBiZWdpbigiZ2xNYXRlcmlhbHh2Iik7CisgICAgICAgIGFyZygiZmFjZSIsIGdldEZhY2VOYW1lKGZhY2UpKTsKKyAgICAgICAgYXJnKCJwbmFtZSIsIGdldE1hdGVyaWFsUE5hbWUocG5hbWUpKTsKKyAgICAgICAgYXJnKCJwYXJhbXMiLCBnZXRNYXRlcmlhbFBhcmFtQ291bnQocG5hbWUpLCBwYXJhbXMsIG9mZnNldCk7CisgICAgICAgIGFyZygib2Zmc2V0Iiwgb2Zmc2V0KTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsTWF0ZXJpYWx4dihmYWNlLCBwbmFtZSwgcGFyYW1zLCBvZmZzZXQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xNYXRlcmlhbHh2KGludCBmYWNlLCBpbnQgcG5hbWUsIEludEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgYmVnaW4oImdsTWF0ZXJpYWx4diIpOworICAgICAgICBhcmcoImZhY2UiLCBnZXRGYWNlTmFtZShmYWNlKSk7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRNYXRlcmlhbFBOYW1lKHBuYW1lKSk7CisgICAgICAgIGFyZygicGFyYW1zIiwgZ2V0TWF0ZXJpYWxQYXJhbUNvdW50KHBuYW1lKSwgcGFyYW1zKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsTWF0ZXJpYWx4dihmYWNlLCBwbmFtZSwgcGFyYW1zKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTWF0cml4TW9kZShpbnQgbW9kZSkgeworICAgICAgICBiZWdpbigiZ2xNYXRyaXhNb2RlIik7CisgICAgICAgIGFyZygibW9kZSIsIGdldE1hdHJpeE1vZGUobW9kZSkpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xNYXRyaXhNb2RlKG1vZGUpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xNdWx0TWF0cml4ZihmbG9hdFtdIG0sIGludCBvZmZzZXQpIHsKKyAgICAgICAgYmVnaW4oImdsTXVsdE1hdHJpeGYiKTsKKyAgICAgICAgYXJnKCJtIiwgMTYsIG0sIG9mZnNldCk7CisgICAgICAgIGFyZygib2Zmc2V0Iiwgb2Zmc2V0KTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsTXVsdE1hdHJpeGYobSwgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTXVsdE1hdHJpeGYoRmxvYXRCdWZmZXIgbSkgeworICAgICAgICBiZWdpbigiZ2xNdWx0TWF0cml4ZiIpOworICAgICAgICBhcmcoIm0iLCAxNiwgbSk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbE11bHRNYXRyaXhmKG0pOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xNdWx0TWF0cml4eChpbnRbXSBtLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGJlZ2luKCJnbE11bHRNYXRyaXh4Iik7CisgICAgICAgIGFyZygibSIsIDE2LCBtLCBvZmZzZXQpOworICAgICAgICBhcmcoIm9mZnNldCIsIG9mZnNldCk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbE11bHRNYXRyaXh4KG0sIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbE11bHRNYXRyaXh4KEludEJ1ZmZlciBtKSB7CisgICAgICAgIGJlZ2luKCJnbE11bHRNYXRyaXh4Iik7CisgICAgICAgIGFyZygibSIsIDE2LCBtKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsTXVsdE1hdHJpeHgobSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbE11bHRpVGV4Q29vcmQ0ZihpbnQgdGFyZ2V0LCBmbG9hdCBzLCBmbG9hdCB0LCBmbG9hdCByLCBmbG9hdCBxKSB7CisgICAgICAgIGJlZ2luKCJnbE11bHRpVGV4Q29vcmQ0ZiIpOworICAgICAgICBhcmcoInRhcmdldCIsIHRhcmdldCk7CisgICAgICAgIGFyZygicyIsIHMpOworICAgICAgICBhcmcoInQiLCB0KTsKKyAgICAgICAgYXJnKCJyIiwgcik7CisgICAgICAgIGFyZygicSIsIHEpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xNdWx0aVRleENvb3JkNGYodGFyZ2V0LCBzLCB0LCByLCBxKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTXVsdGlUZXhDb29yZDR4KGludCB0YXJnZXQsIGludCBzLCBpbnQgdCwgaW50IHIsIGludCBxKSB7CisgICAgICAgIGJlZ2luKCJnbE11bHRpVGV4Q29vcmQ0eCIpOworICAgICAgICBhcmcoInRhcmdldCIsIHRhcmdldCk7CisgICAgICAgIGFyZygicyIsIHMpOworICAgICAgICBhcmcoInQiLCB0KTsKKyAgICAgICAgYXJnKCJyIiwgcik7CisgICAgICAgIGFyZygicSIsIHEpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xNdWx0aVRleENvb3JkNHgodGFyZ2V0LCBzLCB0LCByLCBxKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTm9ybWFsM2YoZmxvYXQgbngsIGZsb2F0IG55LCBmbG9hdCBueikgeworICAgICAgICBiZWdpbigiZ2xOb3JtYWwzZiIpOworICAgICAgICBhcmcoIm54IiwgbngpOworICAgICAgICBhcmcoIm55IiwgbnkpOworICAgICAgICBhcmcoIm56IiwgbnopOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xOb3JtYWwzZihueCwgbnksIG56KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTm9ybWFsM3goaW50IG54LCBpbnQgbnksIGludCBueikgeworICAgICAgICBiZWdpbigiZ2xOb3JtYWwzeCIpOworICAgICAgICBhcmcoIm54IiwgbngpOworICAgICAgICBhcmcoIm55IiwgbnkpOworICAgICAgICBhcmcoIm56IiwgbnopOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xOb3JtYWwzeChueCwgbnksIG56KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsTm9ybWFsUG9pbnRlcihpbnQgdHlwZSwgaW50IHN0cmlkZSwgQnVmZmVyIHBvaW50ZXIpIHsKKyAgICAgICAgYmVnaW4oImdsTm9ybWFsUG9pbnRlciIpOworICAgICAgICBhcmcoInR5cGUiLCB0eXBlKTsKKyAgICAgICAgYXJnKCJzdHJpZGUiLCBzdHJpZGUpOworICAgICAgICBhcmcoInBvaW50ZXIiLCBwb2ludGVyLnRvU3RyaW5nKCkpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgbU5vcm1hbFBvaW50ZXIgPSBuZXcgUG9pbnRlckluZm8oMywgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKKworICAgICAgICBtZ2wuZ2xOb3JtYWxQb2ludGVyKHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbE9ydGhvZihmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsCisgICAgICAgICAgICBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICAgICAgYmVnaW4oImdsT3J0aG9mIik7CisgICAgICAgIGFyZygibGVmdCIsIGxlZnQpOworICAgICAgICBhcmcoInJpZ2h0IiwgcmlnaHQpOworICAgICAgICBhcmcoImJvdHRvbSIsIGJvdHRvbSk7CisgICAgICAgIGFyZygidG9wIiwgdG9wKTsKKyAgICAgICAgYXJnKCJuZWFyIiwgbmVhcik7CisgICAgICAgIGFyZygiZmFyIiwgZmFyKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsT3J0aG9mKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsT3J0aG94KGludCBsZWZ0LCBpbnQgcmlnaHQsIGludCBib3R0b20sIGludCB0b3AsIGludCBuZWFyLAorICAgICAgICAgICAgaW50IGZhcikgeworICAgICAgICBiZWdpbigiZ2xPcnRob3giKTsKKyAgICAgICAgYXJnKCJsZWZ0IiwgbGVmdCk7CisgICAgICAgIGFyZygicmlnaHQiLCByaWdodCk7CisgICAgICAgIGFyZygiYm90dG9tIiwgYm90dG9tKTsKKyAgICAgICAgYXJnKCJ0b3AiLCB0b3ApOworICAgICAgICBhcmcoIm5lYXIiLCBuZWFyKTsKKyAgICAgICAgYXJnKCJmYXIiLCBmYXIpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xPcnRob3gobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xQaXhlbFN0b3JlaShpbnQgcG5hbWUsIGludCBwYXJhbSkgeworICAgICAgICBiZWdpbigiZ2xQaXhlbFN0b3JlaSIpOworICAgICAgICBhcmcoInBuYW1lIiwgcG5hbWUpOworICAgICAgICBhcmcoInBhcmFtIiwgcGFyYW0pOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xQaXhlbFN0b3JlaShwbmFtZSwgcGFyYW0pOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xQb2ludFNpemUoZmxvYXQgc2l6ZSkgeworICAgICAgICBiZWdpbigiZ2xQb2ludFNpemUiKTsKKyAgICAgICAgYXJnKCJzaXplIiwgc2l6ZSk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbFBvaW50U2l6ZShzaXplKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsUG9pbnRTaXpleChpbnQgc2l6ZSkgeworICAgICAgICBiZWdpbigiZ2xQb2ludFNpemV4Iik7CisgICAgICAgIGFyZygic2l6ZSIsIHNpemUpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xQb2ludFNpemV4KHNpemUpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xQb2x5Z29uT2Zmc2V0KGZsb2F0IGZhY3RvciwgZmxvYXQgdW5pdHMpIHsKKyAgICAgICAgYmVnaW4oImdsUG9seWdvbk9mZnNldCIpOworICAgICAgICBhcmcoImZhY3RvciIsIGZhY3Rvcik7CisgICAgICAgIGFyZygidW5pdHMiLCB1bml0cyk7CisgICAgICAgIGVuZCgpOworICAgICAgICBtZ2wuZ2xQb2x5Z29uT2Zmc2V0KGZhY3RvciwgdW5pdHMpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xQb2x5Z29uT2Zmc2V0eChpbnQgZmFjdG9yLCBpbnQgdW5pdHMpIHsKKyAgICAgICAgYmVnaW4oImdsUG9seWdvbk9mZnNldHgiKTsKKyAgICAgICAgYXJnKCJmYWN0b3IiLCBmYWN0b3IpOworICAgICAgICBhcmcoInVuaXRzIiwgdW5pdHMpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xQb2x5Z29uT2Zmc2V0eChmYWN0b3IsIHVuaXRzKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsUG9wTWF0cml4KCkgeworICAgICAgICBiZWdpbigiZ2xQb3BNYXRyaXgiKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsUG9wTWF0cml4KCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFB1c2hNYXRyaXgoKSB7CisgICAgICAgIGJlZ2luKCJnbFB1c2hNYXRyaXgiKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsUHVzaE1hdHJpeCgpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xSZWFkUGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgaW50IHR5cGUsIEJ1ZmZlciBwaXhlbHMpIHsKKyAgICAgICAgYmVnaW4oImdsUmVhZFBpeGVscyIpOworICAgICAgICBhcmcoIngiLCB4KTsKKyAgICAgICAgYXJnKCJ5IiwgeSk7CisgICAgICAgIGFyZygid2lkdGgiLCB3aWR0aCk7CisgICAgICAgIGFyZygiaGVpZ2h0IiwgaGVpZ2h0KTsKKyAgICAgICAgYXJnKCJmb3JtYXQiLCBmb3JtYXQpOworICAgICAgICBhcmcoInR5cGUiLCB0eXBlKTsKKyAgICAgICAgYXJnKCJwaXhlbHMiLCBwaXhlbHMudG9TdHJpbmcoKSk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbFJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xSb3RhdGVmKGZsb2F0IGFuZ2xlLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIGJlZ2luKCJnbFJvdGF0ZWYiKTsKKyAgICAgICAgYXJnKCJhbmdsZSIsIGFuZ2xlKTsKKyAgICAgICAgYXJnKCJ4IiwgeCk7CisgICAgICAgIGFyZygieSIsIHkpOworICAgICAgICBhcmcoInoiLCB6KTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsUm90YXRlZihhbmdsZSwgeCwgeSwgeik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFJvdGF0ZXgoaW50IGFuZ2xlLCBpbnQgeCwgaW50IHksIGludCB6KSB7CisgICAgICAgIGJlZ2luKCJnbFJvdGF0ZXgiKTsKKyAgICAgICAgYXJnKCJhbmdsZSIsIGFuZ2xlKTsKKyAgICAgICAgYXJnKCJ4IiwgeCk7CisgICAgICAgIGFyZygieSIsIHkpOworICAgICAgICBhcmcoInoiLCB6KTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsUm90YXRleChhbmdsZSwgeCwgeSwgeik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFNhbXBsZUNvdmVyYWdlKGZsb2F0IHZhbHVlLCBib29sZWFuIGludmVydCkgeworICAgICAgICBiZWdpbigiZ2xTYW1wbGVDb3ZlcmFnZXgiKTsKKyAgICAgICAgYXJnKCJ2YWx1ZSIsIHZhbHVlKTsKKyAgICAgICAgYXJnKCJpbnZlcnQiLCBpbnZlcnQpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xTYW1wbGVDb3ZlcmFnZSh2YWx1ZSwgaW52ZXJ0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsU2FtcGxlQ292ZXJhZ2V4KGludCB2YWx1ZSwgYm9vbGVhbiBpbnZlcnQpIHsKKyAgICAgICAgYmVnaW4oImdsU2FtcGxlQ292ZXJhZ2V4Iik7CisgICAgICAgIGFyZygidmFsdWUiLCB2YWx1ZSk7CisgICAgICAgIGFyZygiaW52ZXJ0IiwgaW52ZXJ0KTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsU2FtcGxlQ292ZXJhZ2V4KHZhbHVlLCBpbnZlcnQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xTY2FsZWYoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICBiZWdpbigiZ2xTY2FsZWYiKTsKKyAgICAgICAgYXJnKCJ4IiwgeCk7CisgICAgICAgIGFyZygieSIsIHkpOworICAgICAgICBhcmcoInoiLCB6KTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsU2NhbGVmKHgsIHksIHopOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xTY2FsZXgoaW50IHgsIGludCB5LCBpbnQgeikgeworICAgICAgICBiZWdpbigiZ2xTY2FsZXgiKTsKKyAgICAgICAgYXJnKCJ4IiwgeCk7CisgICAgICAgIGFyZygieSIsIHkpOworICAgICAgICBhcmcoInoiLCB6KTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsU2NhbGV4KHgsIHksIHopOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xTY2lzc29yKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIGJlZ2luKCJnbFNjaXNzb3IiKTsKKyAgICAgICAgYXJnKCJ4IiwgeCk7CisgICAgICAgIGFyZygieSIsIHkpOworICAgICAgICBhcmcoIndpZHRoIiwgd2lkdGgpOworICAgICAgICBhcmcoImhlaWdodCIsIGhlaWdodCk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbFNjaXNzb3IoeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFNoYWRlTW9kZWwoaW50IG1vZGUpIHsKKyAgICAgICAgYmVnaW4oImdsU2hhZGVNb2RlbCIpOworICAgICAgICBhcmcoIm1vZGUiLCBnZXRTaGFkZU1vZGVsKG1vZGUpKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsU2hhZGVNb2RlbChtb2RlKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsU3RlbmNpbEZ1bmMoaW50IGZ1bmMsIGludCByZWYsIGludCBtYXNrKSB7CisgICAgICAgIGJlZ2luKCJnbFN0ZW5jaWxGdW5jIik7CisgICAgICAgIGFyZygiZnVuYyIsIGZ1bmMpOworICAgICAgICBhcmcoInJlZiIsIHJlZik7CisgICAgICAgIGFyZygibWFzayIsIG1hc2spOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xTdGVuY2lsRnVuYyhmdW5jLCByZWYsIG1hc2spOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xTdGVuY2lsTWFzayhpbnQgbWFzaykgeworICAgICAgICBiZWdpbigiZ2xTdGVuY2lsTWFzayIpOworICAgICAgICBhcmcoIm1hc2siLCBtYXNrKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsU3RlbmNpbE1hc2sobWFzayk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFN0ZW5jaWxPcChpbnQgZmFpbCwgaW50IHpmYWlsLCBpbnQgenBhc3MpIHsKKyAgICAgICAgYmVnaW4oImdsU3RlbmNpbE9wIik7CisgICAgICAgIGFyZygiZmFpbCIsIGZhaWwpOworICAgICAgICBhcmcoInpmYWlsIiwgemZhaWwpOworICAgICAgICBhcmcoInpwYXNzIiwgenBhc3MpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xTdGVuY2lsT3AoZmFpbCwgemZhaWwsIHpwYXNzKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4Q29vcmRQb2ludGVyKGludCBzaXplLCBpbnQgdHlwZSwgaW50IHN0cmlkZSwgQnVmZmVyIHBvaW50ZXIpIHsKKyAgICAgICAgYmVnaW4oImdsVGV4Q29vcmRQb2ludGVyIik7CisgICAgICAgIGFyZ1BvaW50ZXIoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKKyAgICAgICAgZW5kKCk7CisgICAgICAgIG1UZXhDb29yZFBvaW50ZXIgPSBuZXcgUG9pbnRlckluZm8oc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKKworICAgICAgICBtZ2wuZ2xUZXhDb29yZFBvaW50ZXIoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4RW52ZihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0IHBhcmFtKSB7CisgICAgICAgIGJlZ2luKCJnbFRleEVudmYiKTsKKyAgICAgICAgYXJnKCJ0YXJnZXQiLCBnZXRUZXh0dXJlRW52VGFyZ2V0KHRhcmdldCkpOworICAgICAgICBhcmcoInBuYW1lIiwgZ2V0VGV4dHVyZUVudlBOYW1lKHBuYW1lKSk7CisgICAgICAgIGFyZygicGFyYW0iLCBnZXRUZXh0dXJlRW52UGFyYW1OYW1lKHBhcmFtKSk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbFRleEVudmYodGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xUZXhFbnZmdihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGJlZ2luKCJnbFRleEVudmZ2Iik7CisgICAgICAgIGFyZygidGFyZ2V0IiwgZ2V0VGV4dHVyZUVudlRhcmdldCh0YXJnZXQpKTsKKyAgICAgICAgYXJnKCJwbmFtZSIsIGdldFRleHR1cmVFbnZQTmFtZShwbmFtZSkpOworICAgICAgICBhcmcoInBhcmFtcyIsIGdldFRleHR1cmVFbnZQYXJhbUNvdW50KHBuYW1lKSwgcGFyYW1zLCBvZmZzZXQpOworICAgICAgICBhcmcoIm9mZnNldCIsIG9mZnNldCk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbFRleEVudmZ2KHRhcmdldCwgcG5hbWUsIHBhcmFtcywgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4RW52ZnYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBGbG9hdEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgYmVnaW4oImdsVGV4RW52ZnYiKTsKKyAgICAgICAgYXJnKCJ0YXJnZXQiLCBnZXRUZXh0dXJlRW52VGFyZ2V0KHRhcmdldCkpOworICAgICAgICBhcmcoInBuYW1lIiwgZ2V0VGV4dHVyZUVudlBOYW1lKHBuYW1lKSk7CisgICAgICAgIGFyZygicGFyYW1zIiwgZ2V0VGV4dHVyZUVudlBhcmFtQ291bnQocG5hbWUpLCBwYXJhbXMpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xUZXhFbnZmdih0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xUZXhFbnZ4KGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50IHBhcmFtKSB7CisgICAgICAgIGJlZ2luKCJnbFRleEVudngiKTsKKyAgICAgICAgYXJnKCJ0YXJnZXQiLCBnZXRUZXh0dXJlRW52VGFyZ2V0KHRhcmdldCkpOworICAgICAgICBhcmcoInBuYW1lIiwgZ2V0VGV4dHVyZUVudlBOYW1lKHBuYW1lKSk7CisgICAgICAgIGFyZygicGFyYW0iLCBwYXJhbSk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbFRleEVudngodGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xUZXhFbnZ4dihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICBiZWdpbigiZ2xUZXhFbnZ4diIpOworICAgICAgICBhcmcoInRhcmdldCIsIGdldFRleHR1cmVFbnZUYXJnZXQodGFyZ2V0KSk7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRUZXh0dXJlRW52UE5hbWUocG5hbWUpKTsKKyAgICAgICAgYXJnKCJwYXJhbXMiLCBnZXRUZXh0dXJlRW52UGFyYW1Db3VudChwbmFtZSksIHBhcmFtcywgb2Zmc2V0KTsKKyAgICAgICAgYXJnKCJvZmZzZXQiLCBvZmZzZXQpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xUZXhFbnZ4dih0YXJnZXQsIHBuYW1lLCBwYXJhbXMsIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleEVudnh2KGludCB0YXJnZXQsIGludCBwbmFtZSwgSW50QnVmZmVyIHBhcmFtcykgeworICAgICAgICBiZWdpbigiZ2xUZXhFbnZ4diIpOworICAgICAgICBhcmcoInRhcmdldCIsIGdldFRleHR1cmVFbnZUYXJnZXQodGFyZ2V0KSk7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRUZXh0dXJlRW52UE5hbWUocG5hbWUpKTsKKyAgICAgICAgYXJnKCJwYXJhbXMiLCBnZXRUZXh0dXJlRW52UGFyYW1Db3VudChwbmFtZSksIHBhcmFtcyk7CisgICAgICAgIGVuZCgpOworCisgICAgICAgIG1nbC5nbFRleEVudnh2KHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleEltYWdlMkQoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgaW50ZXJuYWxmb3JtYXQsCisgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBib3JkZXIsIGludCBmb3JtYXQsIGludCB0eXBlLAorICAgICAgICAgICAgQnVmZmVyIHBpeGVscykgeworICAgICAgICBiZWdpbigiZ2xUZXhJbWFnZTJEIik7CisgICAgICAgIGFyZygidGFyZ2V0IiwgdGFyZ2V0KTsKKyAgICAgICAgYXJnKCJsZXZlbCIsIGxldmVsKTsKKyAgICAgICAgYXJnKCJpbnRlcm5hbGZvcm1hdCIsIGludGVybmFsZm9ybWF0KTsKKyAgICAgICAgYXJnKCJ3aWR0aCIsIHdpZHRoKTsKKyAgICAgICAgYXJnKCJoZWlnaHQiLCBoZWlnaHQpOworICAgICAgICBhcmcoImJvcmRlciIsIGJvcmRlcik7CisgICAgICAgIGFyZygiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICAgICAgYXJnKCJ0eXBlIiwgdHlwZSk7CisgICAgICAgIGFyZygicGl4ZWxzIiwgcGl4ZWxzLnRvU3RyaW5nKCkpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wuZ2xUZXhJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIsCisgICAgICAgICAgICAgICAgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xUZXhQYXJhbWV0ZXJmKGludCB0YXJnZXQsIGludCBwbmFtZSwgZmxvYXQgcGFyYW0pIHsKKyAgICAgICAgYmVnaW4oImdsVGV4UGFyYW1ldGVyZiIpOworICAgICAgICBhcmcoInRhcmdldCIsIGdldFRleHR1cmVUYXJnZXQodGFyZ2V0KSk7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRUZXh0dXJlUE5hbWUocG5hbWUpKTsKKyAgICAgICAgYXJnKCJwYXJhbSIsIGdldFRleHR1cmVQYXJhbU5hbWUocGFyYW0pKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsVGV4UGFyYW1ldGVyZih0YXJnZXQsIHBuYW1lLCBwYXJhbSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleFBhcmFtZXRlcngoaW50IHRhcmdldCwgaW50IHBuYW1lLCBpbnQgcGFyYW0pIHsKKyAgICAgICAgYmVnaW4oImdsVGV4UGFyYW1ldGVyeCIpOworICAgICAgICBhcmcoInRhcmdldCIsIGdldFRleHR1cmVUYXJnZXQodGFyZ2V0KSk7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRUZXh0dXJlUE5hbWUocG5hbWUpKTsKKyAgICAgICAgYXJnKCJwYXJhbSIsIHBhcmFtKTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsLmdsVGV4UGFyYW1ldGVyeCh0YXJnZXQsIHBuYW1lLCBwYXJhbSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleFBhcmFtZXRlcml2KGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGJlZ2luKCJnbFRleFBhcmFtZXRlcml2Iik7CisgICAgICAgIGFyZygidGFyZ2V0IiwgZ2V0VGV4dHVyZVRhcmdldCh0YXJnZXQpKTsKKyAgICAgICAgYXJnKCJwbmFtZSIsIGdldFRleHR1cmVQTmFtZShwbmFtZSkpOworICAgICAgICBhcmcoInBhcmFtcyIsIDQsIHBhcmFtcywgb2Zmc2V0KTsKKyAgICAgICAgZW5kKCk7CisKKyAgICAgICAgbWdsMTEuZ2xUZXhQYXJhbWV0ZXJpdih0YXJnZXQsIHBuYW1lLCBwYXJhbXMsIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleFBhcmFtZXRlcml2KGludCB0YXJnZXQsIGludCBwbmFtZSwgSW50QnVmZmVyIHBhcmFtcykgeworICAgICAgICBiZWdpbigiZ2xUZXhQYXJhbWV0ZXJpdiIpOworICAgICAgICBhcmcoInRhcmdldCIsIGdldFRleHR1cmVUYXJnZXQodGFyZ2V0KSk7CisgICAgICAgIGFyZygicG5hbWUiLCBnZXRUZXh0dXJlUE5hbWUocG5hbWUpKTsKKyAgICAgICAgYXJnKCJwYXJhbXMiLCA0LCBwYXJhbXMpOworICAgICAgICBlbmQoKTsKKworICAgICAgICBtZ2wxMS5nbFRleFBhcmFtZXRlcml2KHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleFN1YkltYWdlMkQoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgeG9mZnNldCwKKyAgICAgICAgICAgIGludCB5b2Zmc2V0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIGludCB0eXBlLAorICAgICAgICAgICAgQnVmZmVyIHBpeGVscykgeworICAgICAgICBiZWdpbigiZ2xUZXhTdWJJbWFnZTJEIik7CisgICAgICAgIGFyZygidGFyZ2V0IiwgZ2V0VGV4dHVyZVRhcmdldCh0YXJnZXQpKTsKKyAgICAgICAgYXJnKCJsZXZlbCIsIGxldmVsKTsKKyAgICAgICAgYXJnKCJ4b2Zmc2V0IiwgeG9mZnNldCk7CisgICAgICAgIGFyZygieW9mZnNldCIsIHlvZmZzZXQpOworICAgICAgICBhcmcoIndpZHRoIiwgd2lkdGgpOworICAgICAgICBhcmcoImhlaWdodCIsIGhlaWdodCk7CisgICAgICAgIGFyZygiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICAgICAgYXJnKCJ0eXBlIiwgdHlwZSk7CisgICAgICAgIGFyZygicGl4ZWxzIiwgcGl4ZWxzLnRvU3RyaW5nKCkpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgbWdsLmdsVGV4U3ViSW1hZ2UyRCh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVHJhbnNsYXRlZihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIGJlZ2luKCJnbFRyYW5zbGF0ZWYiKTsKKyAgICAgICAgYXJnKCJ4IiwgeCk7CisgICAgICAgIGFyZygieSIsIHkpOworICAgICAgICBhcmcoInoiLCB6KTsKKyAgICAgICAgZW5kKCk7CisgICAgICAgIG1nbC5nbFRyYW5zbGF0ZWYoeCwgeSwgeik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRyYW5zbGF0ZXgoaW50IHgsIGludCB5LCBpbnQgeikgeworICAgICAgICBiZWdpbigiZ2xUcmFuc2xhdGV4Iik7CisgICAgICAgIGFyZygieCIsIHgpOworICAgICAgICBhcmcoInkiLCB5KTsKKyAgICAgICAgYXJnKCJ6Iiwgeik7CisgICAgICAgIGVuZCgpOworICAgICAgICBtZ2wuZ2xUcmFuc2xhdGV4KHgsIHksIHopOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xWZXJ0ZXhQb2ludGVyKGludCBzaXplLCBpbnQgdHlwZSwgaW50IHN0cmlkZSwgQnVmZmVyIHBvaW50ZXIpIHsKKyAgICAgICAgYmVnaW4oImdsVmVydGV4UG9pbnRlciIpOworICAgICAgICBhcmdQb2ludGVyKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7CisgICAgICAgIGVuZCgpOworICAgICAgICBtVmVydGV4UG9pbnRlciA9IG5ldyBQb2ludGVySW5mbyhzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOworICAgICAgICBtZ2wuZ2xWZXJ0ZXhQb2ludGVyKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFZpZXdwb3J0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIGJlZ2luKCJnbFZpZXdwb3J0Iik7CisgICAgICAgIGFyZygieCIsIHgpOworICAgICAgICBhcmcoInkiLCB5KTsKKyAgICAgICAgYXJnKCJ3aWR0aCIsIHdpZHRoKTsKKyAgICAgICAgYXJnKCJoZWlnaHQiLCBoZWlnaHQpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgbWdsLmdsVmlld3BvcnQoeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbENsaXBQbGFuZWYoaW50IHBsYW5lLCBmbG9hdFtdIGVxdWF0aW9uLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGJlZ2luKCJnbENsaXBQbGFuZWYiKTsKKyAgICAgICAgYXJnKCJwbGFuZSIsIHBsYW5lKTsKKyAgICAgICAgYXJnKCJlcXVhdGlvbiIsIDQsIGVxdWF0aW9uLCBvZmZzZXQpOworICAgICAgICBhcmcoIm9mZnNldCIsIG9mZnNldCk7CisgICAgICAgIGVuZCgpOworICAgICAgICBtZ2wxMS5nbENsaXBQbGFuZWYocGxhbmUsIGVxdWF0aW9uLCBvZmZzZXQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDbGlwUGxhbmVmKGludCBwbGFuZSwgRmxvYXRCdWZmZXIgZXF1YXRpb24pIHsKKyAgICAgICAgYmVnaW4oImdsQ2xpcFBsYW5lZiIpOworICAgICAgICBhcmcoInBsYW5lIiwgcGxhbmUpOworICAgICAgICBhcmcoImVxdWF0aW9uIiwgNCwgZXF1YXRpb24pOworICAgICAgICBlbmQoKTsKKyAgICAgICAgbWdsMTEuZ2xDbGlwUGxhbmVmKHBsYW5lLCBlcXVhdGlvbik7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbENsaXBQbGFuZXgoaW50IHBsYW5lLCBpbnRbXSBlcXVhdGlvbiwgaW50IG9mZnNldCkgeworICAgICAgICBiZWdpbigiZ2xDbGlwUGxhbmV4Iik7CisgICAgICAgIGFyZygicGxhbmUiLCBwbGFuZSk7CisgICAgICAgIGFyZygiZXF1YXRpb24iLCA0LCBlcXVhdGlvbiwgb2Zmc2V0KTsKKyAgICAgICAgYXJnKCJvZmZzZXQiLCBvZmZzZXQpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgbWdsMTEuZ2xDbGlwUGxhbmV4KHBsYW5lLCBlcXVhdGlvbiwgb2Zmc2V0KTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ2xpcFBsYW5leChpbnQgcGxhbmUsIEludEJ1ZmZlciBlcXVhdGlvbikgeworICAgICAgICBiZWdpbigiZ2xDbGlwUGxhbmVmIik7CisgICAgICAgIGFyZygicGxhbmUiLCBwbGFuZSk7CisgICAgICAgIGFyZygiZXF1YXRpb24iLCA0LCBlcXVhdGlvbik7CisgICAgICAgIGVuZCgpOworICAgICAgICBtZ2wxMS5nbENsaXBQbGFuZXgocGxhbmUsIGVxdWF0aW9uKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIC8vIERyYXcgVGV4dHVyZSBFeHRlbnNpb24KKworICAgIHB1YmxpYyB2b2lkIGdsRHJhd1RleGZPRVMoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwKKyAgICAgICAgZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCkgeworICAgICAgICBiZWdpbigiZ2xEcmF3VGV4Zk9FUyIpOworICAgICAgICBhcmcoIngiLCB4KTsKKyAgICAgICAgYXJnKCJ5IiwgeSk7CisgICAgICAgIGFyZygieiIsIHopOworICAgICAgICBhcmcoIndpZHRoIiwgd2lkdGgpOworICAgICAgICBhcmcoImhlaWdodCIsIGhlaWdodCk7CisgICAgICAgIGVuZCgpOworICAgICAgICBtZ2wxMUV4dC5nbERyYXdUZXhmT0VTKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEcmF3VGV4ZnZPRVMoZmxvYXRbXSBjb29yZHMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgYmVnaW4oImdsRHJhd1RleGZ2T0VTIik7CisgICAgICAgIGFyZygiY29vcmRzIiwgNSwgY29vcmRzLCBvZmZzZXQpOworICAgICAgICBhcmcoIm9mZnNldCIsIG9mZnNldCk7CisgICAgICAgIGVuZCgpOworICAgICAgICBtZ2wxMUV4dC5nbERyYXdUZXhmdk9FUyhjb29yZHMsIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERyYXdUZXhmdk9FUyhGbG9hdEJ1ZmZlciBjb29yZHMpIHsKKyAgICAgICAgYmVnaW4oImdsRHJhd1RleGZ2T0VTIik7CisgICAgICAgIGFyZygiY29vcmRzIiwgNSwgY29vcmRzKTsKKyAgICAgICAgZW5kKCk7CisgICAgICAgIG1nbDExRXh0LmdsRHJhd1RleGZ2T0VTKGNvb3Jkcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERyYXdUZXhpT0VTKGludCB4LCBpbnQgeSwgaW50IHosIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBiZWdpbigiZ2xEcmF3VGV4aU9FUyIpOworICAgICAgICBhcmcoIngiLCB4KTsKKyAgICAgICAgYXJnKCJ5IiwgeSk7CisgICAgICAgIGFyZygieiIsIHopOworICAgICAgICBhcmcoIndpZHRoIiwgd2lkdGgpOworICAgICAgICBhcmcoImhlaWdodCIsIGhlaWdodCk7CisgICAgICAgIGVuZCgpOworICAgICAgICBtZ2wxMUV4dC5nbERyYXdUZXhpT0VTKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEcmF3VGV4aXZPRVMoaW50W10gY29vcmRzLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGJlZ2luKCJnbERyYXdUZXhpdk9FUyIpOworICAgICAgICBhcmcoImNvb3JkcyIsIDUsIGNvb3Jkcywgb2Zmc2V0KTsKKyAgICAgICAgYXJnKCJvZmZzZXQiLCBvZmZzZXQpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgbWdsMTFFeHQuZ2xEcmF3VGV4aXZPRVMoY29vcmRzLCBvZmZzZXQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEcmF3VGV4aXZPRVMoSW50QnVmZmVyIGNvb3JkcykgeworICAgICAgICBiZWdpbigiZ2xEcmF3VGV4aXZPRVMiKTsKKyAgICAgICAgYXJnKCJjb29yZHMiLCA1LCBjb29yZHMpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgbWdsMTFFeHQuZ2xEcmF3VGV4aXZPRVMoY29vcmRzKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRHJhd1RleHNPRVMoc2hvcnQgeCwgc2hvcnQgeSwgc2hvcnQgeiwKKyAgICAgICAgc2hvcnQgd2lkdGgsIHNob3J0IGhlaWdodCkgeworICAgICAgICBiZWdpbigiZ2xEcmF3VGV4c09FUyIpOworICAgICAgICBhcmcoIngiLCB4KTsKKyAgICAgICAgYXJnKCJ5IiwgeSk7CisgICAgICAgIGFyZygieiIsIHopOworICAgICAgICBhcmcoIndpZHRoIiwgd2lkdGgpOworICAgICAgICBhcmcoImhlaWdodCIsIGhlaWdodCk7CisgICAgICAgIGVuZCgpOworICAgICAgICBtZ2wxMUV4dC5nbERyYXdUZXhzT0VTKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEcmF3VGV4c3ZPRVMoc2hvcnRbXSBjb29yZHMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgYmVnaW4oImdsRHJhd1RleHN2T0VTIik7CisgICAgICAgIGFyZygiY29vcmRzIiwgNSwgY29vcmRzLCBvZmZzZXQpOworICAgICAgICBhcmcoIm9mZnNldCIsIG9mZnNldCk7CisgICAgICAgIGVuZCgpOworICAgICAgICBtZ2wxMUV4dC5nbERyYXdUZXhzdk9FUyhjb29yZHMsIG9mZnNldCk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERyYXdUZXhzdk9FUyhTaG9ydEJ1ZmZlciBjb29yZHMpIHsKKyAgICAgICAgYmVnaW4oImdsRHJhd1RleHN2T0VTIik7CisgICAgICAgIGFyZygiY29vcmRzIiwgNSwgY29vcmRzKTsKKyAgICAgICAgZW5kKCk7CisgICAgICAgIG1nbDExRXh0LmdsRHJhd1RleHN2T0VTKGNvb3Jkcyk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERyYXdUZXh4T0VTKGludCB4LCBpbnQgeSwgaW50IHosIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBiZWdpbigiZ2xEcmF3VGV4eE9FUyIpOworICAgICAgICBhcmcoIngiLCB4KTsKKyAgICAgICAgYXJnKCJ5IiwgeSk7CisgICAgICAgIGFyZygieiIsIHopOworICAgICAgICBhcmcoIndpZHRoIiwgd2lkdGgpOworICAgICAgICBhcmcoImhlaWdodCIsIGhlaWdodCk7CisgICAgICAgIGVuZCgpOworICAgICAgICBtZ2wxMUV4dC5nbERyYXdUZXh4T0VTKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEcmF3VGV4eHZPRVMoaW50W10gY29vcmRzLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGJlZ2luKCJnbERyYXdUZXh4dk9FUyIpOworICAgICAgICBhcmcoImNvb3JkcyIsIDUsIGNvb3Jkcywgb2Zmc2V0KTsKKyAgICAgICAgYXJnKCJvZmZzZXQiLCBvZmZzZXQpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgbWdsMTFFeHQuZ2xEcmF3VGV4eHZPRVMoY29vcmRzLCBvZmZzZXQpOworICAgICAgICBjaGVja0Vycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEcmF3VGV4eHZPRVMoSW50QnVmZmVyIGNvb3JkcykgeworICAgICAgICBiZWdpbigiZ2xEcmF3VGV4eHZPRVMiKTsKKyAgICAgICAgYXJnKCJjb29yZHMiLCA1LCBjb29yZHMpOworICAgICAgICBlbmQoKTsKKyAgICAgICAgbWdsMTFFeHQuZ2xEcmF3VGV4eHZPRVMoY29vcmRzKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2xRdWVyeU1hdHJpeHhPRVMoaW50W10gbWFudGlzc2EsIGludCBtYW50aXNzYU9mZnNldCwKKyAgICAgICAgaW50W10gZXhwb25lbnQsIGludCBleHBvbmVudE9mZnNldCkgeworICAgICAgICBiZWdpbigiZ2xRdWVyeU1hdHJpeHhPRVMiKTsKKyAgICAgICAgYXJnKCJtYW50aXNzYSIsIEFycmF5cy50b1N0cmluZyhtYW50aXNzYSkpOworICAgICAgICBhcmcoImV4cG9uZW50IiwgQXJyYXlzLnRvU3RyaW5nKGV4cG9uZW50KSk7CisgICAgICAgIGVuZCgpOworICAgICAgICBpbnQgdmFsaWQgPSBtZ2wxMEV4dC5nbFF1ZXJ5TWF0cml4eE9FUyhtYW50aXNzYSwgbWFudGlzc2FPZmZzZXQsCisgICAgICAgICAgICBleHBvbmVudCwgZXhwb25lbnRPZmZzZXQpOworICAgICAgICByZXR1cm5zKHRvU3RyaW5nKDE2LCBGT1JNQVRfRklYRUQsIG1hbnRpc3NhLCBtYW50aXNzYU9mZnNldCkpOworICAgICAgICByZXR1cm5zKHRvU3RyaW5nKDE2LCBGT1JNQVRfSU5ULCBleHBvbmVudCwgZXhwb25lbnRPZmZzZXQpKTsKKyAgICAgICAgY2hlY2tFcnJvcigpOworICAgICAgICByZXR1cm4gdmFsaWQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnbFF1ZXJ5TWF0cml4eE9FUyhJbnRCdWZmZXIgbWFudGlzc2EsIEludEJ1ZmZlciBleHBvbmVudCkgeworICAgICAgICBiZWdpbigiZ2xRdWVyeU1hdHJpeHhPRVMiKTsKKyAgICAgICAgYXJnKCJtYW50aXNzYSIsIG1hbnRpc3NhLnRvU3RyaW5nKCkpOworICAgICAgICBhcmcoImV4cG9uZW50IiwgZXhwb25lbnQudG9TdHJpbmcoKSk7CisgICAgICAgIGVuZCgpOworICAgICAgICBpbnQgdmFsaWQgPSBtZ2wxMEV4dC5nbFF1ZXJ5TWF0cml4eE9FUyhtYW50aXNzYSwgZXhwb25lbnQpOworICAgICAgICByZXR1cm5zKHRvU3RyaW5nKDE2LCBGT1JNQVRfRklYRUQsIG1hbnRpc3NhKSk7CisgICAgICAgIHJldHVybnModG9TdHJpbmcoMTYsIEZPUk1BVF9JTlQsIGV4cG9uZW50KSk7CisgICAgICAgIGNoZWNrRXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIHZhbGlkOworICAgIH0KKworICAgIC8vIFVuc3VwcG9ydGVkIEdMMTEgbWV0aG9kcworCisgICAgcHVibGljIHZvaWQgZ2xCaW5kQnVmZmVyKGludCB0YXJnZXQsIGludCBidWZmZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xCdWZmZXJEYXRhKGludCB0YXJnZXQsIGludCBzaXplLCBCdWZmZXIgZGF0YSwgaW50IHVzYWdlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQnVmZmVyU3ViRGF0YShpbnQgdGFyZ2V0LCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSwgQnVmZmVyIGRhdGEpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xDb2xvcjR1YihieXRlIHJlZCwgYnl0ZSBncmVlbiwgYnl0ZSBibHVlLCBieXRlIGFscGhhKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRGVsZXRlQnVmZmVycyhpbnQgbiwgaW50W10gYnVmZmVycywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERlbGV0ZUJ1ZmZlcnMoaW50IG4sIEludEJ1ZmZlciBidWZmZXJzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2VuQnVmZmVycyhpbnQgbiwgaW50W10gYnVmZmVycywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdlbkJ1ZmZlcnMoaW50IG4sIEludEJ1ZmZlciBidWZmZXJzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0Qm9vbGVhbnYoaW50IHBuYW1lLCBib29sZWFuW10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0Qm9vbGVhbnYoaW50IHBuYW1lLCBJbnRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIEludEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRDbGlwUGxhbmVmKGludCBwbmFtZSwgZmxvYXRbXSBlcW4sIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRDbGlwUGxhbmVmKGludCBwbmFtZSwgRmxvYXRCdWZmZXIgZXFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0Q2xpcFBsYW5leChpbnQgcG5hbWUsIGludFtdIGVxbiwgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldENsaXBQbGFuZXgoaW50IHBuYW1lLCBJbnRCdWZmZXIgZXFuKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0Rml4ZWR2KGludCBwbmFtZSwgaW50W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0Rml4ZWR2KGludCBwbmFtZSwgSW50QnVmZmVyIHBhcmFtcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldEZsb2F0dihpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0RmxvYXR2KGludCBwbmFtZSwgRmxvYXRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0TGlnaHRmdihpbnQgbGlnaHQsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRMaWdodGZ2KGludCBsaWdodCwgaW50IHBuYW1lLCBGbG9hdEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRMaWdodHh2KGludCBsaWdodCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRMaWdodHh2KGludCBsaWdodCwgaW50IHBuYW1lLCBJbnRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0TWF0ZXJpYWxmdihpbnQgZmFjZSwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldE1hdGVyaWFsZnYoaW50IGZhY2UsIGludCBwbmFtZSwgRmxvYXRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0TWF0ZXJpYWx4dihpbnQgZmFjZSwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRNYXRlcmlhbHh2KGludCBmYWNlLCBpbnQgcG5hbWUsIEludEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRUZXhFbnZpdihpbnQgZW52LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldFRleEVudml2KGludCBlbnYsIGludCBwbmFtZSwgSW50QnVmZmVyIHBhcmFtcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldFRleEVudnh2KGludCBlbnYsIGludCBwbmFtZSwgaW50W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0VGV4RW52eHYoaW50IGVudiwgaW50IHBuYW1lLCBJbnRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyZnYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldFRleFBhcmFtZXRlcmZ2KGludCB0YXJnZXQsIGludCBwbmFtZSwgRmxvYXRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyaXYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJpdihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIEludEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJ4dihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldFRleFBhcmFtZXRlcnh2KGludCB0YXJnZXQsIGludCBwbmFtZSwgSW50QnVmZmVyIHBhcmFtcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnbElzQnVmZmVyKGludCBidWZmZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2xJc0VuYWJsZWQoaW50IGNhcCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnbElzVGV4dHVyZShpbnQgdGV4dHVyZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFBvaW50UGFyYW1ldGVyZihpbnQgcG5hbWUsIGZsb2F0IHBhcmFtKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJmdihpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJmdihpbnQgcG5hbWUsIEZsb2F0QnVmZmVyIHBhcmFtcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFBvaW50UGFyYW1ldGVyeChpbnQgcG5hbWUsIGludCBwYXJhbSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFBvaW50UGFyYW1ldGVyeHYoaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xQb2ludFBhcmFtZXRlcnh2KGludCBwbmFtZSwgSW50QnVmZmVyIHBhcmFtcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFBvaW50U2l6ZVBvaW50ZXJPRVMoaW50IHR5cGUsIGludCBzdHJpZGUsIEJ1ZmZlciBwb2ludGVyKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4RW52aShpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludCBwYXJhbSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleEVudml2KGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4RW52aXYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBJbnRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4UGFyYW1ldGVyZnYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleFBhcmFtZXRlcmZ2KGludCB0YXJnZXQsIGludCBwbmFtZSwgRmxvYXRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4UGFyYW1ldGVyaShpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludCBwYXJhbSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleFBhcmFtZXRlcnh2KGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4UGFyYW1ldGVyeHYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBJbnRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUG9pbnRlckluZm8geworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBwZXIgdmVydGV4LiAxLi40CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IG1TaXplOworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgZWFjaCBjb29yZGluYXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBtVHlwZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBieXRlIG9mZnNldCBiZXR3ZWVuIGNvbnNlY3V0aXZlIHZlcnRpY2VzLiAwIG1lYW5zIG1TaXplICoKKyAgICAgICAgICogc2l6ZW9mKG1UeXBlKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBtU3RyaWRlOworICAgICAgICBwdWJsaWMgQnVmZmVyIG1Qb2ludGVyOworICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBtVGVtcEJ5dGVCdWZmZXI7IC8vIE9ubHkgdmFsaWQgZHVyaW5nIGdsRHJhd1hYWCBjYWxscworCisgICAgICAgIHB1YmxpYyBQb2ludGVySW5mbyhpbnQgc2l6ZSwgaW50IHR5cGUsIGludCBzdHJpZGUsIEJ1ZmZlciBwb2ludGVyKSB7CisgICAgICAgICAgICBtU2l6ZSA9IHNpemU7CisgICAgICAgICAgICBtVHlwZSA9IHR5cGU7CisgICAgICAgICAgICBtU3RyaWRlID0gc3RyaWRlOworICAgICAgICAgICAgbVBvaW50ZXIgPSBwb2ludGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBzaXplb2YoaW50IHR5cGUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgY2FzZSBHTF9CWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgY2FzZSBHTF9TSE9SVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgIGNhc2UgR0xfRklYRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgICAgICBjYXNlIEdMX0ZMT0FUOgorICAgICAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0U3RyaWRlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1TdHJpZGUgPiAwID8gbVN0cmlkZSA6IHNpemVvZihtVHlwZSkgKiBtU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGJpbmRCeXRlQnVmZmVyKCkgeworICAgICAgICAgICAgbVRlbXBCeXRlQnVmZmVyID0gdG9CeXRlQnVmZmVyKC0xLCBtUG9pbnRlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB1bmJpbmRCeXRlQnVmZmVyKCkgeworICAgICAgICAgICAgbVRlbXBCeXRlQnVmZmVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgV3JpdGVyIG1Mb2c7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Mb2dBcmd1bWVudE5hbWVzOworICAgIHByaXZhdGUgaW50IG1BcmdDb3VudDsKKworICAgIHByaXZhdGUgUG9pbnRlckluZm8gbUNvbG9yUG9pbnRlcjsKKyAgICBwcml2YXRlIFBvaW50ZXJJbmZvIG1Ob3JtYWxQb2ludGVyOworICAgIHByaXZhdGUgUG9pbnRlckluZm8gbVRleENvb3JkUG9pbnRlcjsKKyAgICBwcml2YXRlIFBvaW50ZXJJbmZvIG1WZXJ0ZXhQb2ludGVyOworCisgICAgYm9vbGVhbiBtQ29sb3JBcnJheUVuYWJsZWQ7CisgICAgYm9vbGVhbiBtTm9ybWFsQXJyYXlFbmFibGVkOworICAgIGJvb2xlYW4gbVRleHR1cmVDb29yZEFycmF5RW5hYmxlZDsKKyAgICBib29sZWFuIG1WZXJ0ZXhBcnJheUVuYWJsZWQ7CisKKyAgICBTdHJpbmdCdWlsZGVyIG1TdHJpbmdCdWlsZGVyOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvR0xTdXJmYWNlVmlldy5qYXZhIGIvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvR0xTdXJmYWNlVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYzUzZjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9HTFN1cmZhY2VWaWV3LmphdmEKQEAgLTAsMCArMSw2NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQub3BlbmdsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTE7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMU3VyZmFjZTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTdXJmYWNlVmlldyB0aGF0IHVzZXMgdGhlIGRlZGljYXRlZCBzdXJmYWNlIGZvcgorICogZGlzcGxheWluZyBhbiBPcGVuR0wgYW5pbWF0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIGFuaW1hdGlvbiB0byBydW4gaW4gYQorICogc2VwYXJhdGUgdGhyZWFkLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IGl0IGJlIGRyaXZlbiBieSB0aGUgdXBkYXRlIG1lY2hhbmlzbQorICogb2YgdGhlIHZpZXcgaGllcmFyY2h5LgorICoKKyAqIFRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZW5kZXJpbmcgY29kZSBpcyBkZWxlZ2F0ZWQgdG8gYSBHTFZpZXcuUmVuZGVyZXIKKyAqIGluc3RhbmNlLgorICovCitwdWJsaWMgY2xhc3MgR0xTdXJmYWNlVmlldyBleHRlbmRzIFN1cmZhY2VWaWV3IGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjayB7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUkVOREVSTU9ERV9XSEVOX0RJUlRZID0gMDsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBSRU5ERVJNT0RFX0NPTlRVT1VTTFkgPSAxOworCisgICAgLyoqCisgICAgICogQ2hlY2sgZ2xFcnJvcigpIGFmdGVyIGV2ZXJ5IEdMIGNhbGwuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVCVUdfQ0hFQ0tfR0xfRVJST1IgPSAxOworCisgICAgLyoqCisgICAgICogTG9nIEdMIGNhbGxzIHRvIHRoZSBzeXN0ZW0gbG9nIGF0ICJ2ZXJib3NlIiBsZXZlbCB3aXRoIHRhZyAiR0xTdXJmYWNlVmlldyIuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgREVCVUdfTE9HX0dMX0NBTExTID0gMjsKKworICAgIHB1YmxpYyBHTFN1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgaW5pdCgpOworICAgIH0KKworICAgIHB1YmxpYyBHTFN1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgaW5pdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0KCkgeworICAgICAgICAvLyBJbnN0YWxsIGEgU3VyZmFjZUhvbGRlci5DYWxsYmFjayBzbyB3ZSBnZXQgbm90aWZpZWQgd2hlbiB0aGUKKyAgICAgICAgLy8gdW5kZXJseWluZyBzdXJmYWNlIGlzIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZAorICAgICAgICBTdXJmYWNlSG9sZGVyIGhvbGRlciA9IGdldEhvbGRlcigpOworICAgICAgICBob2xkZXIuYWRkQ2FsbGJhY2sodGhpcyk7CisgICAgICAgIGhvbGRlci5zZXRUeXBlKFN1cmZhY2VIb2xkZXIuU1VSRkFDRV9UWVBFX0dQVSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnbFdyYXBwZXIgdG8gYSBuZXcgdmFsdWUuIFRoZSBjdXJyZW50IGdsV3JhcHBlciBpcyB1c2VkCisgICAgICogd2hlbmV2ZXIgYSBzdXJmYWNlIGlzIGNyZWF0ZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG51bGwuCisgICAgICogQHBhcmFtIGdsV3JhcHBlciB0aGUgbmV3IEdMV3JhcHBlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdMV3JhcHBlcihHTFdyYXBwZXIgZ2xXcmFwcGVyKSB7CisgICAgICAgIG1HTFdyYXBwZXIgPSBnbFdyYXBwZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWJ1ZyBmbGFncyB0byBhIG5ldyB2YWx1ZS4gVGhlIGRlYnVnIGZsYWdzIHRha2UgZWZmZWN0CisgICAgICogd2hlbmV2ZXIgYSBzdXJmYWNlIGlzIGNyZWF0ZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHplcm8uCisgICAgICogQHBhcmFtIGRlYnVnRmxhZ3MgdGhlIG5ldyBkZWJ1ZyBmbGFncworICAgICAqIEBzZWUgI0RFQlVHX0NIRUNLX0dMX0VSUk9SCisgICAgICogQHNlZSAjREVCVUdfTE9HX0dMX0NBTExTCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVidWdGbGFncyhpbnQgZGVidWdGbGFncykgeworICAgICAgICBtRGVidWdGbGFncyA9IGRlYnVnRmxhZ3M7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREZWJ1Z0ZsYWdzKCkgeworICAgICAgICByZXR1cm4gbURlYnVnRmxhZ3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZW5kZXJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB2aWV3LiBDYW4gb25seSBiZSBjYWxsZWQgb25jZS4KKyAgICAgKiBAcGFyYW0gcmVuZGVyZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJlcihSZW5kZXJlciByZW5kZXJlcikgeworICAgICAgICBpZiAobUdMVGhyZWFkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNldFJlbmRlcmVyIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIGluc3RhbmNlLiIpOworICAgICAgICB9CisgICAgICAgIG1HTFRocmVhZCA9IG5ldyBHTFRocmVhZChyZW5kZXJlcik7CisgICAgICAgIG1HTFRocmVhZC5zdGFydCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVuZGVyaW5nIG1vZGUuIFdoZW4gdGhlIHJlbmRlck1vZGUgaXMKKyAgICAgKiBSRU5ERVJNT0RFX0NPTlRJTlVPVVNMWSwgdGhlIHJlbmRlcmVyIGlzIGNhbGxlZAorICAgICAqIHJlcGVhdGVkbHkgdG8gcmUtcmVuZGVyIHRoZSBzY2VuZS4gV2hlbiB0aGUgcmVuZGVybW9kZQorICAgICAqIGlzIFJFTkRFUk1PREVfV0hFTl9ESVJUWSwgdGhlIHJlbmRlcmVyIG9ubHkgcmVuZGVyZWQgd2hlbiB0aGUgc3VyZmFjZQorICAgICAqIGlzIGNyZWF0ZWQsIG9yIHdoZW4gcmVxdWVzdFJlbmRlciBpcyBjYWxsZWQuIERlZmF1bHRzIHRvIFJFTkRFUk1PREVfQ09OVElOVU9VU0xZLgorICAgICAqIEBwYXJhbSByZW5kZXJNb2RlIG9uZSBvZiB0aGUgUkVOREVSTU9ERV9YIGNvbnN0YW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbmRlck1vZGUoaW50IHJlbmRlck1vZGUpIHsKKyAgICAgICAgbUdMVGhyZWFkLnNldFJlbmRlck1vZGUocmVuZGVyTW9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHJlbmRlcmluZyBtb2RlLiBNYXkgYmUgY2FsbGVkCisgICAgICogZnJvbSBhbnkgdGhyZWFkLiBNdXN0IG5vdCBiZSBjYWxsZWQgYmVmb3JlIGEgcmVuZGVyZXIgaGFzIGJlZW4gc2V0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVuZGVyZXIgd2lsbCByZW5kZXIgY29udGludW91c2x5LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVuZGVyTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1HTFRocmVhZC5nZXRSZW5kZXJNb2RlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVxdWVzdCB0aGF0IHRoZSByZW5kZXJlciByZW5kZXIgYSBmcmFtZS4gTWF5IGJlIGNhbGxlZAorICAgICAqIGZyb20gYW55IHRocmVhZC4gTXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBhIHJlbmRlcmVyIGhhcyBiZWVuIHNldC4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuIHRoZSByZW5kZXIgbW9kZSBoYXMgYmVlbiBzZXQgdG8KKyAgICAgKiBmYWxzZSwgc28gdGhhdCBmcmFtZXMgYXJlIG9ubHkgcmVuZGVyZWQgb24gZGVtYW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RSZW5kZXIoKSB7CisgICAgICAgIG1HTFRocmVhZC5yZXF1ZXN0UmVuZGVyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgbUdMVGhyZWFkLnN1cmZhY2VDcmVhdGVkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3VyZmFjZURlc3Ryb3llZChTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICAvLyBTdXJmYWNlIHdpbGwgYmUgZGVzdHJveWVkIHdoZW4gd2UgcmV0dXJuCisgICAgICAgIG1HTFRocmVhZC5zdXJmYWNlRGVzdHJveWVkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgeworICAgICAgICBtR0xUaHJlYWQub25XaW5kb3dSZXNpemUodywgaCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5mb3JtIHRoZSB2aWV3IHRoYXQgdGhlIGFjdGl2aXR5IGlzIHBhdXNlZC4gVGhlIG93bmVyIG9mIHRoaXMgdmlldyBtdXN0CisgICAgICogY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBwYXVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgbUdMVGhyZWFkLm9uUGF1c2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm0gdGhlIHZpZXcgdGhhdCB0aGUgYWN0aXZpdHkgaXMgcmVzdW1lZC4gVGhlIG93bmVyIG9mIHRoaXMgdmlldyBtdXN0CisgICAgICogY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyByZXN1bWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBtR0xUaHJlYWQub25SZXN1bWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWV1ZSBhbiAiZXZlbnQiIHRvIGJlIHJ1biBvbiB0aGUgR0wgcmVuZGVyaW5nIHRocmVhZC4KKyAgICAgKiBAcGFyYW0gciB0aGUgcnVubmFibGUgdG8gYmUgcnVuIG9uIHRoZSBHTCByZW5kZXJpbmcgdGhyZWFkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHF1ZXVlRXZlbnQoUnVubmFibGUgcikgeworICAgICAgICBtR0xUaHJlYWQucXVldWVFdmVudChyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKKyAgICAgICAgbUdMVGhyZWFkLnJlcXVlc3RFeGl0QW5kV2FpdCgpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgR0xXcmFwcGVyIHsKKyAgICAgIEdMIHdyYXAoR0wgZ2wpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIEEgZ2VuZXJpYyByZW5kZXJlciBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBSZW5kZXJlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBFR0wgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIGRlc2lyZWQgYnkgdGhlIHJlbmRlcmVyLgorICAgICAgICAgKi8KKyAgICAgICAgaW50W10gZ2V0Q29uZmlnU3BlYygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdXJmYWNlIGNyZWF0ZWQuCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdXJmYWNlIGlzIGNyZWF0ZWQuIENhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgKiBzdGFydHMsIGFuZCB3aGVuZXZlciB0aGUgR1BVIGlzIHJlaW5pdGlhbGl6ZWQuIFRoaXMgd2lsbAorICAgICAgICAgKiB0eXBpY2FsbHkgaGFwcGVuIHdoZW4gdGhlIGRldmljZSBhd2FrZXMgYWZ0ZXIgZ29pbmcgdG8gc2xlZXAuCisgICAgICAgICAqIFNldCB5b3VyIHRleHR1cmVzIGhlcmUuCisgICAgICAgICAqIEBwYXJhbSBnbCB0aGUgR0wgaW50ZXJmYWNlLiBVc2UgPGNvZGU+aW5zdGFuY2VvZjwvY29kZT4gdG8KKyAgICAgICAgICogdGVzdCBpZiB0aGUgaW50ZXJmYWNlIHN1cHBvcnRzIEdMMTEgb3IgaGlnaGVyIGludGVyZmFjZXMuCisgICAgICAgICAqIEBwYXJhbSBjb25maWcgdGhlIEVHTENvbmZpZyBvZiB0aGUgY3JlYXRlZCBzdXJmYWNlLiBDYW4gYmUgdXNlZAorICAgICAgICAgKiB0byBjcmVhdGUgbWF0Y2hpbmcgcGJ1ZmZlcnMuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZyk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTdXJmYWNlIGNoYW5nZWQgc2l6ZS4KKyAgICAgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBzdXJmYWNlIGlzIGNyZWF0ZWQgYW5kIHdoZW5ldmVyCisgICAgICAgICAqIHRoZSBPcGVuR0wgRVMgc3VyZmFjZSBzaXplIGNoYW5nZXMuIFNldCB5b3VyIHZpZXdwb3J0IGhlcmUuCisgICAgICAgICAqIEBwYXJhbSBnbCB0aGUgR0wgaW50ZXJmYWNlLiBVc2UgPGNvZGU+aW5zdGFuY2VvZjwvY29kZT4gdG8KKyAgICAgICAgICogdGVzdCBpZiB0aGUgaW50ZXJmYWNlIHN1cHBvcnRzIEdMMTEgb3IgaGlnaGVyIGludGVyZmFjZXMuCisgICAgICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIERyYXcgdGhlIGN1cnJlbnQgZnJhbWUuCisgICAgICAgICAqIEBwYXJhbSBnbCB0aGUgR0wgaW50ZXJmYWNlLiBVc2UgPGNvZGU+aW5zdGFuY2VvZjwvY29kZT4gdG8KKyAgICAgICAgICogdGVzdCBpZiB0aGUgaW50ZXJmYWNlIHN1cHBvcnRzIEdMMTEgb3IgaGlnaGVyIGludGVyZmFjZXMuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uRHJhd0ZyYW1lKEdMMTAgZ2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIEVHTCBoZWxwZXIgY2xhc3MuCisgICAgICovCisKKyAgICBwcml2YXRlIGNsYXNzIEVnbEhlbHBlciB7CisgICAgICAgIHB1YmxpYyBFZ2xIZWxwZXIoKSB7CisKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbml0aWFsaXplIEVHTCBmb3IgYSBnaXZlbiBjb25maWd1cmF0aW9uIHNwZWMuCisgICAgICAgICAqIEBwYXJhbSBjb25maWdTcGVjCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydChpbnRbXSBjb25maWdTcGVjKXsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBHZXQgYW4gRUdMIGluc3RhbmNlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1FZ2wgPSAoRUdMMTApIEVHTENvbnRleHQuZ2V0RUdMKCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBHZXQgdG8gdGhlIGRlZmF1bHQgZGlzcGxheS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbUVnbERpc3BsYXkgPSBtRWdsLmVnbEdldERpc3BsYXkoRUdMMTAuRUdMX0RFRkFVTFRfRElTUExBWSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBXZSBjYW4gbm93IGluaXRpYWxpemUgRUdMIGZvciB0aGF0IGRpc3BsYXkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50W10gdmVyc2lvbiA9IG5ldyBpbnRbMl07CisgICAgICAgICAgICBtRWdsLmVnbEluaXRpYWxpemUobUVnbERpc3BsYXksIHZlcnNpb24pOworCisgICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzID0gbmV3IEVHTENvbmZpZ1sxXTsKKyAgICAgICAgICAgIGludFtdIG51bV9jb25maWcgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgbUVnbC5lZ2xDaG9vc2VDb25maWcobUVnbERpc3BsYXksIGNvbmZpZ1NwZWMsIGNvbmZpZ3MsIDEsCisgICAgICAgICAgICAgICAgICAgIG51bV9jb25maWcpOworICAgICAgICAgICAgbUVnbENvbmZpZyA9IGNvbmZpZ3NbMF07CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIENyZWF0ZSBhbiBPcGVuR0wgRVMgY29udGV4dC4gVGhpcyBtdXN0IGJlIGRvbmUgb25seSBvbmNlLCBhbgorICAgICAgICAgICAgKiBPcGVuR0wgY29udGV4dCBpcyBhIHNvbWV3aGF0IGhlYXZ5IG9iamVjdC4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBtRWdsQ29udGV4dCA9IG1FZ2wuZWdsQ3JlYXRlQ29udGV4dChtRWdsRGlzcGxheSwgbUVnbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PX0NPTlRFWFQsIG51bGwpOworCisgICAgICAgICAgICBtRWdsU3VyZmFjZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBSZWFjdCB0byB0aGUgY3JlYXRpb24gb2YgYSBuZXcgc3VyZmFjZSBieSBjcmVhdGluZyBhbmQgcmV0dXJuaW5nIGFuCisgICAgICAgICAqIE9wZW5HTCBpbnRlcmZhY2UgdGhhdCByZW5kZXJzIHRvIHRoYXQgc3VyZmFjZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBHTCBjcmVhdGVTdXJmYWNlKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogIFRoZSB3aW5kb3cgc2l6ZSBoYXMgY2hhbmdlZCwgc28gd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcKKyAgICAgICAgICAgICAqICBzdXJmYWNlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAobUVnbFN1cmZhY2UgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBVbmJpbmQgYW5kIGRlc3Ryb3kgdGhlIG9sZCBFR0wgc3VyZmFjZSwgaWYKKyAgICAgICAgICAgICAgICAgKiB0aGVyZSBpcyBvbmUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbUVnbC5lZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgRUdMMTAuRUdMX05PX1NVUkZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX0NPTlRFWFQpOworICAgICAgICAgICAgICAgIG1FZ2wuZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENyZWF0ZSBhbiBFR0wgc3VyZmFjZSB3ZSBjYW4gcmVuZGVyIGludG8uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1FZ2xTdXJmYWNlID0gbUVnbC5lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKG1FZ2xEaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICBtRWdsQ29uZmlnLCBob2xkZXIsIG51bGwpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQmVmb3JlIHdlIGNhbiBpc3N1ZSBHTCBjb21tYW5kcywgd2UgbmVlZCB0byBtYWtlIHN1cmUKKyAgICAgICAgICAgICAqIHRoZSBjb250ZXh0IGlzIGN1cnJlbnQgYW5kIGJvdW5kIHRvIGEgc3VyZmFjZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbUVnbC5lZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICBtRWdsQ29udGV4dCk7CisKKworICAgICAgICAgICAgR0wgZ2wgPSBtRWdsQ29udGV4dC5nZXRHTCgpOworICAgICAgICAgICAgaWYgKG1HTFdyYXBwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGdsID0gbUdMV3JhcHBlci53cmFwKGdsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChtRGVidWdGbGFncyAmIChERUJVR19DSEVDS19HTF9FUlJPUiB8IERFQlVHX0xPR19HTF9DQUxMUykpIT0gMCkgeworICAgICAgICAgICAgICAgIGludCBjb25maWdGbGFncyA9IDA7CisgICAgICAgICAgICAgICAgV3JpdGVyIGxvZyA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKChtRGVidWdGbGFncyAmIERFQlVHX0NIRUNLX0dMX0VSUk9SKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0ZsYWdzIHw9IEdMRGVidWdIZWxwZXIuQ09ORklHX0NIRUNLX0dMX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKG1EZWJ1Z0ZsYWdzICYgREVCVUdfTE9HX0dMX0NBTExTKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZyA9IG5ldyBMb2dXcml0ZXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2wgPSBHTERlYnVnSGVscGVyLndyYXAoZ2wsIGNvbmZpZ0ZsYWdzLCBsb2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGdsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERpc3BsYXkgdGhlIGN1cnJlbnQgcmVuZGVyIHN1cmZhY2UuCisgICAgICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIGNvbnRleHQgaGFzIGJlZW4gbG9zdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN3YXAoKSB7CisgICAgICAgICAgICBtRWdsLmVnbFN3YXBCdWZmZXJzKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBbHdheXMgY2hlY2sgZm9yIEVHTF9DT05URVhUX0xPU1QsIHdoaWNoIG1lYW5zIHRoZSBjb250ZXh0CisgICAgICAgICAgICAgKiBhbmQgYWxsIGFzc29jaWF0ZWQgZGF0YSB3ZXJlIGxvc3QgKEZvciBpbnN0YW5jZSBiZWNhdXNlCisgICAgICAgICAgICAgKiB0aGUgZGV2aWNlIHdlbnQgdG8gc2xlZXApLiBXZSBuZWVkIHRvIHNsZWVwIHVudGlsIHdlCisgICAgICAgICAgICAgKiBnZXQgYSBuZXcgc3VyZmFjZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuIG1FZ2wuZWdsR2V0RXJyb3IoKSAhPSBFR0wxMS5FR0xfQ09OVEVYVF9MT1NUOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICAgICAgaWYgKG1FZ2xTdXJmYWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRWdsLmVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBFR0wxMC5FR0xfTk9fU1VSRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT19TVVJGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PX0NPTlRFWFQpOworICAgICAgICAgICAgICAgIG1FZ2wuZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKKyAgICAgICAgICAgICAgICBtRWdsU3VyZmFjZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUVnbENvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1FZ2wuZWdsRGVzdHJveUNvbnRleHQobUVnbERpc3BsYXksIG1FZ2xDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBtRWdsQ29udGV4dCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUVnbERpc3BsYXkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1FZ2wuZWdsVGVybWluYXRlKG1FZ2xEaXNwbGF5KTsKKyAgICAgICAgICAgICAgICBtRWdsRGlzcGxheSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBFR0wxMCBtRWdsOworICAgICAgICBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5OworICAgICAgICBFR0xTdXJmYWNlIG1FZ2xTdXJmYWNlOworICAgICAgICBFR0xDb25maWcgbUVnbENvbmZpZzsKKyAgICAgICAgRUdMQ29udGV4dCBtRWdsQ29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGdlbmVyaWMgR0wgVGhyZWFkLiBUYWtlcyBjYXJlIG9mIGluaXRpYWxpemluZyBFR0wgYW5kIEdMLiBEZWxlZ2F0ZXMKKyAgICAgKiB0byBhIFJlbmRlcmVyIGluc3RhbmNlIHRvIGRvIHRoZSBhY3R1YWwgZHJhd2luZy4gQ2FuIGJlIGNvbmZpZ3VyZWQgdG8KKyAgICAgKiByZW5kZXIgY29udGludW91c2x5IG9yIG9uIHJlcXVlc3QuCisgICAgICoKKyAgICAgKi8KKyAgICBjbGFzcyBHTFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgICAgIEdMVGhyZWFkKFJlbmRlcmVyIHJlbmRlcmVyKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgbURvbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIG1XaWR0aCA9IDA7CisgICAgICAgICAgICBtSGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIG1SZXF1ZXN0UmVuZGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIG1SZW5kZXJNb2RlID0gUkVOREVSTU9ERV9DT05UVU9VU0xZOworICAgICAgICAgICAgbVJlbmRlcmVyID0gcmVuZGVyZXI7CisgICAgICAgICAgICBzZXROYW1lKCJHTFRocmVhZCIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBXaGVuIHRoZSBhbmRyb2lkIGZyYW1ld29yayBsYXVuY2hlcyBhIHNlY29uZCBpbnN0YW5jZSBvZgorICAgICAgICAgICAgICogYW4gYWN0aXZpdHksIHRoZSBuZXcgaW5zdGFuY2UncyBvbkNyZWF0ZSgpIG1ldGhvZCBtYXkgYmUKKyAgICAgICAgICAgICAqIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGluc3RhbmNlIHJldHVybnMgZnJvbSBvbkRlc3Ryb3koKS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUaGlzIHNlbWFwaG9yZSBlbnN1cmVzIHRoYXQgb25seSBvbmUgaW5zdGFuY2UgYXQgYSB0aW1lCisgICAgICAgICAgICAgKiBhY2Nlc3NlcyBFR0wuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzRWdsU2VtYXBob3JlLmFjcXVpcmUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ3VhcmRlZFJ1bigpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhydSBhbmQgZXhpdCBub3JtYWxseQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBzRWdsU2VtYXBob3JlLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBndWFyZGVkUnVuKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG1FZ2xIZWxwZXIgPSBuZXcgRWdsSGVscGVyKCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gZm9yIG91ciBvcGVuZ2wgc2Vzc2lvbgorICAgICAgICAgICAgICogYW5kIGdyYWIgdGhlIGZpcnN0IGNvbmZpZ3VyYXRpb24gdGhhdCBtYXRjaGVzIGlzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludFtdIGNvbmZpZ1NwZWMgPSBtUmVuZGVyZXIuZ2V0Q29uZmlnU3BlYygpOworICAgICAgICAgICAgbUVnbEhlbHBlci5zdGFydChjb25maWdTcGVjKTsKKworICAgICAgICAgICAgR0wxMCBnbCA9IG51bGw7CisgICAgICAgICAgICBib29sZWFuIHRlbGxSZW5kZXJlclN1cmZhY2VDcmVhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJvb2xlYW4gdGVsbFJlbmRlcmVyU3VyZmFjZUNoYW5nZWQgPSB0cnVlOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhpcyBpcyBvdXIgbWFpbiBhY3Rpdml0eSB0aHJlYWQncyBsb29wLCB3ZSBnbyB1bnRpbAorICAgICAgICAgICAgICogYXNrZWQgdG8gcXVpdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgd2hpbGUgKCFtRG9uZSkgeworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiAgVXBkYXRlIHRoZSBhc3luY2hyb25vdXMgc3RhdGUgKHdpbmRvdyBzaXplKQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGludCB3LCBoOworICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZDsKKyAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRTdGFydCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICBSdW5uYWJsZSByOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHIgPSBnZXRFdmVudCgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByLnJ1bigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRWdsSGVscGVyLmZpbmlzaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmVlZFN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmVlZFRvV2FpdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Eb25lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gbVNpemVDaGFuZ2VkOworICAgICAgICAgICAgICAgICAgICB3ID0gbVdpZHRoOworICAgICAgICAgICAgICAgICAgICBoID0gbUhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgbVNpemVDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0UmVuZGVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuZWVkU3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUVnbEhlbHBlci5zdGFydChjb25maWdTcGVjKTsKKyAgICAgICAgICAgICAgICAgICAgdGVsbFJlbmRlcmVyU3VyZmFjZUNyZWF0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2wgPSAoR0wxMCkgbUVnbEhlbHBlci5jcmVhdGVTdXJmYWNlKGdldEhvbGRlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVsbFJlbmRlcmVyU3VyZmFjZUNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGVsbFJlbmRlcmVyU3VyZmFjZUNyZWF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLm9uU3VyZmFjZUNyZWF0ZWQoZ2wsIG1FZ2xIZWxwZXIubUVnbENvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgIHRlbGxSZW5kZXJlclN1cmZhY2VDcmVhdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0ZWxsUmVuZGVyZXJTdXJmYWNlQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgICAgICBtUmVuZGVyZXIub25TdXJmYWNlQ2hhbmdlZChnbCwgdywgaCk7CisgICAgICAgICAgICAgICAgICAgIHRlbGxSZW5kZXJlclN1cmZhY2VDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgodyA+IDApICYmIChoID4gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZHJhdyBhIGZyYW1lIGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLm9uRHJhd0ZyYW1lKGdsKTsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBPbmNlIHdlJ3JlIGRvbmUgd2l0aCBHTCwgd2UgbmVlZCB0byBjYWxsIHN3YXBCdWZmZXJzKCkKKyAgICAgICAgICAgICAgICAgICAgICogdG8gaW5zdHJ1Y3QgdGhlIHN5c3RlbSB0byBkaXNwbGF5IHRoZSByZW5kZXJlZCBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbUVnbEhlbHBlci5zd2FwKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGNsZWFuLXVwIGV2ZXJ5dGhpbmcuLi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbUVnbEhlbHBlci5maW5pc2goKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkVG9XYWl0KCkgeworICAgICAgICAgICAgaWYgKG1Eb25lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVBhdXNlZCB8fCAoISBtSGFzU3VyZmFjZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChtV2lkdGggPiAwKSAmJiAobUhlaWdodCA+IDApICYmIChtUmVxdWVzdFJlbmRlciB8fCAobVJlbmRlck1vZGUgPT0gUkVOREVSTU9ERV9DT05UVU9VU0xZKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmVuZGVyTW9kZShpbnQgcmVuZGVyTW9kZSkgeworICAgICAgICAgICAgaWYgKCAhKChSRU5ERVJNT0RFX1dIRU5fRElSVFkgPD0gcmVuZGVyTW9kZSkgJiYgKHJlbmRlck1vZGUgPD0gUkVOREVSTU9ERV9DT05UVU9VU0xZKSkgKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVuZGVyTW9kZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBtUmVuZGVyTW9kZSA9IHJlbmRlck1vZGU7CisgICAgICAgICAgICAgICAgaWYgKHJlbmRlck1vZGUgPT0gUkVOREVSTU9ERV9DT05UVU9VU0xZKSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UmVuZGVyTW9kZSgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1SZW5kZXJNb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFJlbmRlcigpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAgICAgbVJlcXVlc3RSZW5kZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIG1IYXNTdXJmYWNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VEZXN0cm95ZWQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIG1IYXNTdXJmYWNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgbVBhdXNlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uV2luZG93UmVzaXplKGludCB3LCBpbnQgaCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgbVdpZHRoID0gdzsKKyAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gaDsKKyAgICAgICAgICAgICAgICBtU2l6ZUNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdEV4aXRBbmRXYWl0KCkgeworICAgICAgICAgICAgLy8gZG9uJ3QgY2FsbCB0aGlzIGZyb20gR0xUaHJlYWQgdGhyZWFkIG9yIGl0IGlzIGEgZ3VhcmFudGVlZAorICAgICAgICAgICAgLy8gZGVhZGxvY2shCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIG1Eb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgam9pbigpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFF1ZXVlIGFuICJldmVudCIgdG8gYmUgcnVuIG9uIHRoZSBHTCByZW5kZXJpbmcgdGhyZWFkLgorICAgICAgICAgKiBAcGFyYW0gciB0aGUgcnVubmFibGUgdG8gYmUgcnVuIG9uIHRoZSBHTCByZW5kZXJpbmcgdGhyZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcXVldWVFdmVudChSdW5uYWJsZSByKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIG1FdmVudFF1ZXVlLmFkZChyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUnVubmFibGUgZ2V0RXZlbnQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIGlmIChtRXZlbnRRdWV1ZS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtRXZlbnRRdWV1ZS5yZW1vdmUoMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRG9uZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1QYXVzZWQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzU3VyZmFjZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVdpZHRoOworICAgICAgICBwcml2YXRlIGludCBtSGVpZ2h0OworICAgICAgICBwcml2YXRlIGludCBtUmVuZGVyTW9kZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXF1ZXN0UmVuZGVyOworICAgICAgICBwcml2YXRlIFJlbmRlcmVyIG1SZW5kZXJlcjsKKyAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8UnVubmFibGU+IG1FdmVudFF1ZXVlID0gbmV3IEFycmF5TGlzdDxSdW5uYWJsZT4oKTsKKyAgICAgICAgcHJpdmF0ZSBFZ2xIZWxwZXIgbUVnbEhlbHBlcjsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTG9nV3JpdGVyIGV4dGVuZHMgV3JpdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICBmbHVzaEJ1aWxkZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKKyAgICAgICAgICAgIGZsdXNoQnVpbGRlcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXJbXSBidWYsIGludCBvZmZzZXQsIGludCBjb3VudCkgeworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBidWZbb2Zmc2V0ICsgaV07CisgICAgICAgICAgICAgICAgaWYgKCBjID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZsdXNoQnVpbGRlcigpIHsKKyAgICAgICAgICAgIGlmIChtQnVpbGRlci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBMb2cudigiR0xTdXJmYWNlVmlldyIsIG1CdWlsZGVyLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1CdWlsZGVyLmRlbGV0ZSgwLCBtQnVpbGRlci5sZW5ndGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgbUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNlbWFwaG9yZSBzRWdsU2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZSgxKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNpemVDaGFuZ2VkID0gdHJ1ZTsKKworICAgIHByaXZhdGUgR0xUaHJlYWQgbUdMVGhyZWFkOworICAgIHByaXZhdGUgR0xXcmFwcGVyIG1HTFdyYXBwZXI7CisgICAgcHJpdmF0ZSBpbnQgbURlYnVnRmxhZ3M7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9HTFUuamF2YSBiL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dMVS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNTJmNDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9HTFUuamF2YQpAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5vcGVuZ2w7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOworCisvKioKKyAqIEEgc2V0IG9mIEdMIHV0aWxpdGllcyBpbnNwaXJlZCBieSB0aGUgT3BlbkdMIFV0aWxpdHkgVG9vbGtpdC4KKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBHTFUgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGVycm9yIHN0cmluZyBmcm9tIGEgR0wgb3IgR0xVIGVycm9yIGNvZGUuCisgICAgICogCisgICAgICogQHBhcmFtIGVycm9yIC0gYSBHTCBvciBHTFUgZXJyb3IgY29kZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBlcnJvciBzdHJpbmcgZm9yIHRoZSBpbnB1dCBlcnJvciBjb2RlLCBvciBOVUxMIGlmIHRoZSBpbnB1dAorICAgICAqICAgICAgICAgd2FzIG5vdCBhIHZhbGlkIEdMIG9yIEdMVSBlcnJvciBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdsdUVycm9yU3RyaW5nKGludCBlcnJvcikgeworICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgIGNhc2UgR0wxMC5HTF9OT19FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiAibm8gZXJyb3IiOworICAgICAgICBjYXNlIEdMMTAuR0xfSU5WQUxJRF9FTlVNOgorICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkIGVudW0iOworICAgICAgICBjYXNlIEdMMTAuR0xfSU5WQUxJRF9WQUxVRToKKyAgICAgICAgICAgIHJldHVybiAiaW52YWxpZCB2YWx1ZSI7CisgICAgICAgIGNhc2UgR0wxMC5HTF9JTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHJldHVybiAiaW52YWxpZCBvcGVyYXRpb24iOworICAgICAgICBjYXNlIEdMMTAuR0xfU1RBQ0tfT1ZFUkZMT1c6CisgICAgICAgICAgICByZXR1cm4gInN0YWNrIG92ZXJmbG93IjsKKyAgICAgICAgY2FzZSBHTDEwLkdMX1NUQUNLX1VOREVSRkxPVzoKKyAgICAgICAgICAgIHJldHVybiAic3RhY2sgdW5kZXJmbG93IjsKKyAgICAgICAgY2FzZSBHTDEwLkdMX09VVF9PRl9NRU1PUlk6CisgICAgICAgICAgICByZXR1cm4gIm91dCBvZiBtZW1vcnkiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmUgYSB2aWV3aW5nIHRyYW5zZm9ybWF0aW9uIGluIHRlcm1zIG9mIGFuIGV5ZSBwb2ludCwgYSBjZW50ZXIgb2YKKyAgICAgKiB2aWV3LCBhbmQgYW4gdXAgdmVjdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSBnbCBhIEdMMTAgaW50ZXJmYWNlCisgICAgICogQHBhcmFtIGV5ZVggZXllIHBvaW50IFgKKyAgICAgKiBAcGFyYW0gZXllWSBleWUgcG9pbnQgWQorICAgICAqIEBwYXJhbSBleWVaIGV5ZSBwb2ludCBaCisgICAgICogQHBhcmFtIGNlbnRlclggY2VudGVyIG9mIHZpZXcgWAorICAgICAqIEBwYXJhbSBjZW50ZXJZIGNlbnRlciBvZiB2aWV3IFkKKyAgICAgKiBAcGFyYW0gY2VudGVyWiBjZW50ZXIgb2YgdmlldyBaCisgICAgICogQHBhcmFtIHVwWCB1cCB2ZWN0b3IgWAorICAgICAqIEBwYXJhbSB1cFkgdXAgdmVjdG9yIFkKKyAgICAgKiBAcGFyYW0gdXBaIHVwIHZlY3RvciBaCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGdsdUxvb2tBdChHTDEwIGdsLCBmbG9hdCBleWVYLCBmbG9hdCBleWVZLCBmbG9hdCBleWVaLAorICAgICAgICAgICAgZmxvYXQgY2VudGVyWCwgZmxvYXQgY2VudGVyWSwgZmxvYXQgY2VudGVyWiwgZmxvYXQgdXBYLCBmbG9hdCB1cFksCisgICAgICAgICAgICBmbG9hdCB1cFopIHsKKworICAgICAgICAvLyBTZWUgdGhlIE9wZW5HTCBHTFVUIGRvY3VtZW50YXRpb24gZm9yIGdsdUxvb2tBdCBmb3IgYSBkZXNjcmlwdGlvbgorICAgICAgICAvLyBvZiB0aGUgYWxnb3JpdGhtLiBXZSBpbXBsZW1lbnQgaXQgaW4gYSBzdHJhaWdodGZvcndhcmQgd2F5OgorCisgICAgICAgIGZsb2F0IGZ4ID0gY2VudGVyWCAtIGV5ZVg7CisgICAgICAgIGZsb2F0IGZ5ID0gY2VudGVyWSAtIGV5ZVk7CisgICAgICAgIGZsb2F0IGZ6ID0gY2VudGVyWiAtIGV5ZVo7CisKKyAgICAgICAgLy8gTm9ybWFsaXplIGYKKyAgICAgICAgZmxvYXQgcmxmID0gMS4wZiAvIE1hdHJpeC5sZW5ndGgoZngsIGZ5LCBmeik7CisgICAgICAgIGZ4ICo9IHJsZjsKKyAgICAgICAgZnkgKj0gcmxmOworICAgICAgICBmeiAqPSBybGY7CisKKyAgICAgICAgLy8gY29tcHV0ZSBzID0gZiB4IHVwICh4IG1lYW5zICJjcm9zcyBwcm9kdWN0IikKKyAgICAgICAgZmxvYXQgc3ggPSBmeSAqIHVwWiAtIGZ6ICogdXBZOworICAgICAgICBmbG9hdCBzeSA9IGZ6ICogdXBYIC0gZnggKiB1cFo7CisgICAgICAgIGZsb2F0IHN6ID0gZnggKiB1cFkgLSBmeSAqIHVwWDsKKyAgICAgICAgCisgICAgICAgIC8vIGFuZCBub3JtYWxpemUgcworICAgICAgICBmbG9hdCBybHMgPSAxLjBmIC8gTWF0cml4Lmxlbmd0aChzeCwgc3ksIHN6KTsKKyAgICAgICAgc3ggKj0gcmxzOworICAgICAgICBzeSAqPSBybHM7CisgICAgICAgIHN6ICo9IHJsczsKKyAgICAgICAgCisgICAgICAgIC8vIGNvbXB1dGUgdSA9IHMgeCBmCisgICAgICAgIGZsb2F0IHV4ID0gc3kgKiBmeiAtIHN6ICogZnk7CisgICAgICAgIGZsb2F0IHV5ID0gc3ogKiBmeCAtIHN4ICogZno7CisgICAgICAgIGZsb2F0IHV6ID0gc3ggKiBmeSAtIHN5ICogZng7CisKKyAgICAgICAgZmxvYXRbXSBtID0gbmV3IGZsb2F0WzE2XTsKKyAgICAgICAgbVswXSA9IHN4OworICAgICAgICBtWzFdID0gdXg7CisgICAgICAgIG1bMl0gPSAtZng7CisgICAgICAgIG1bM10gPSAwLjBmOworCisgICAgICAgIG1bNF0gPSBzeTsKKyAgICAgICAgbVs1XSA9IHV5OworICAgICAgICBtWzZdID0gLWZ5OworICAgICAgICBtWzddID0gMC4wZjsKKworICAgICAgICBtWzhdID0gc3o7CisgICAgICAgIG1bOV0gPSB1ejsKKyAgICAgICAgbVsxMF0gPSAtZno7CisgICAgICAgIG1bMTFdID0gMC4wZjsKKworICAgICAgICBtWzEyXSA9IDAuMGY7CisgICAgICAgIG1bMTNdID0gMC4wZjsKKyAgICAgICAgbVsxNF0gPSAwLjBmOworICAgICAgICBtWzE1XSA9IDEuMGY7CisKKyAgICAgICAgZ2wuZ2xNdWx0TWF0cml4ZihtLCAwKTsKKyAgICAgICAgZ2wuZ2xUcmFuc2xhdGVmKC1leWVYLCAtZXllWSwgLWV5ZVopOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB1cCBhIDJEIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIG1hdHJpeAorICAgICAqIAorICAgICAqIEBwYXJhbSBnbAorICAgICAqIEBwYXJhbSBsZWZ0CisgICAgICogQHBhcmFtIHJpZ2h0CisgICAgICogQHBhcmFtIGJvdHRvbQorICAgICAqIEBwYXJhbSB0b3AKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ2x1T3J0aG8yRChHTDEwIGdsLCBmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwKKyAgICAgICAgICAgIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wKSB7CisgICAgICAgIGdsLmdsT3J0aG9mKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgLTEuMGYsIDEuMGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB1cCBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4CisgICAgICogCisgICAgICogQHBhcmFtIGdsIGEgR0wxMCBpbnRlcmZhY2UKKyAgICAgKiBAcGFyYW0gZm92eSBzcGVjaWZpZXMgdGhlIGZpZWxkIG9mIHZpZXcgYW5nbGUsIGluIGRlZ3JlZXMsIGluIHRoZSBZCisgICAgICogICAgICAgIGRpcmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gYXNwZWN0IHNwZWNpZmllcyB0aGUgYXNwZWN0IHJhdGlvbiB0aGF0IGRldGVybWlucyB0aGUgZmllbGQgb2YKKyAgICAgKiAgICAgICAgdmlldyBpbiB0aGUgeCBkaXJlY3Rpb24uIFRoZSBhc3BlY3QgcmF0aW8gaXMgdGhlIHJhdGlvIG9mIHgKKyAgICAgKiAgICAgICAgKHdpZHRoKSB0byB5IChoZWlnaHQpLgorICAgICAqIEBwYXJhbSB6TmVhciBzcGVjaWZpZXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHZpZXdlciB0byB0aGUgbmVhciBjbGlwcGluZworICAgICAqICAgICAgICBwbGFuZSAoYWx3YXlzIHBvc2l0aXZlKS4KKyAgICAgKiBAcGFyYW0gekZhciBzcGVjaWZpZXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHZpZXdlciB0byB0aGUgZmFyIGNsaXBwaW5nCisgICAgICogICAgICAgIHBsYW5lIChhbHdheXMgcG9zaXRpdmUpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnbHVQZXJzcGVjdGl2ZShHTDEwIGdsLCBmbG9hdCBmb3Z5LCBmbG9hdCBhc3BlY3QsCisgICAgICAgICAgICBmbG9hdCB6TmVhciwgZmxvYXQgekZhcikgeworICAgICAgICBmbG9hdCB0b3AgPSB6TmVhciAqIChmbG9hdCkgTWF0aC50YW4oZm92eSAqIChNYXRoLlBJIC8gMzYwLjApKTsKKyAgICAgICAgZmxvYXQgYm90dG9tID0gLXRvcDsKKyAgICAgICAgZmxvYXQgbGVmdCA9IGJvdHRvbSAqIGFzcGVjdDsKKyAgICAgICAgZmxvYXQgcmlnaHQgPSB0b3AgKiBhc3BlY3Q7CisgICAgICAgIGdsLmdsRnJ1c3R1bWYobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFwIG9iamVjdCBjb29yZGluYXRlcyBpbnRvIHdpbmRvdyBjb29yZGluYXRlcy4gZ2x1UHJvamVjdCB0cmFuc2Zvcm1zIHRoZQorICAgICAqIHNwZWNpZmllZCBvYmplY3QgY29vcmRpbmF0ZXMgaW50byB3aW5kb3cgY29vcmRpbmF0ZXMgdXNpbmcgbW9kZWwsIHByb2osCisgICAgICogYW5kIHZpZXcuIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHdpbi4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgeW91IGNhbiB1c2UgdGhlIE9FU19tYXRyaXhfZ2V0IGV4dGVuc2lvbiwgaWYgcHJlc2VudCwgdG8gZ2V0CisgICAgICogdGhlIGN1cnJlbnQgbW9kZWxWaWV3IGFuZCBwcm9qZWN0aW9uIG1hdHJpY2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmpYIG9iamVjdCBjb29yZGluYXRlcyBYCisgICAgICogQHBhcmFtIG9ialkgb2JqZWN0IGNvb3JkaW5hdGVzIFkKKyAgICAgKiBAcGFyYW0gb2JqWiBvYmplY3QgY29vcmRpbmF0ZXMgWgorICAgICAqIEBwYXJhbSBtb2RlbCB0aGUgY3VycmVudCBtb2RlbHZpZXcgbWF0cml4CisgICAgICogQHBhcmFtIG1vZGVsT2Zmc2V0IHRoZSBvZmZzZXQgaW50byB0aGUgbW9kZWwgYXJyYXkgd2hlcmUgdGhlIG1vZGVsdmlldworICAgICAqICAgICAgICBtYXh0cml4IGRhdGEgc3RhcnRzLgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBjdXJyZW50IHByb2plY3Rpb24gbWF0cml4CisgICAgICogQHBhcmFtIHByb2plY3RPZmZzZXQgdGhlIG9mZnNldCBpbnRvIHRoZSBwcm9qZWN0IGFycmF5IHdoZXJlIHRoZSBwcm9qZWN0CisgICAgICogICAgICAgIG1hdHJpeCBkYXRhIHN0YXJ0cy4KKyAgICAgKiBAcGFyYW0gdmlldyB0aGUgY3VycmVudCB2aWV3LCB7eCwgeSwgd2lkdGgsIGhlaWdodH0KKyAgICAgKiBAcGFyYW0gdmlld09mZnNldCB0aGUgb2Zmc2V0IGludG8gdGhlIHZpZXcgYXJyYXkgd2hlcmUgdGhlIHZpZXcgdmVjdG9yCisgICAgICogICAgICAgIGRhdGEgc3RhcnRzLgorICAgICAqIEBwYXJhbSB3aW4gdGhlIG91dHB1dCB2ZWN0b3Ige3dpblgsIHdpblksIHdpblp9LCB0aGF0IHJldHVybnMgdGhlCisgICAgICogICAgICAgIGNvbXB1dGVkIHdpbmRvdyBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0gd2luT2Zmc2V0IHRoZSBvZmZzZXQgaW50byB0aGUgd2luIGFycmF5IHdoZXJlIHRoZSB3aW4gdmVjdG9yIGRhdGEKKyAgICAgKiAgICAgICAgc3RhcnRzLgorICAgICAqIEByZXR1cm4gQSByZXR1cm4gdmFsdWUgb2YgR0xfVFJVRSBpbmRpY2F0ZXMgc3VjY2VzcywgYSByZXR1cm4gdmFsdWUgb2YKKyAgICAgKiAgICAgICAgIEdMX0ZBTFNFIGluZGljYXRlcyBmYWlsdXJlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdsdVByb2plY3QoZmxvYXQgb2JqWCwgZmxvYXQgb2JqWSwgZmxvYXQgb2JqWiwKKyAgICAgICAgICAgIGZsb2F0W10gbW9kZWwsIGludCBtb2RlbE9mZnNldCwgZmxvYXRbXSBwcm9qZWN0LCBpbnQgcHJvamVjdE9mZnNldCwKKyAgICAgICAgICAgIGludFtdIHZpZXcsIGludCB2aWV3T2Zmc2V0LCBmbG9hdFtdIHdpbiwgaW50IHdpbk9mZnNldCkgeworICAgICAgICBmbG9hdFtdIG0gPSBuZXcgZmxvYXRbMTZdOworICAgICAgICBNYXRyaXgubXVsdGlwbHlNTShtLCAwLCBwcm9qZWN0LCBwcm9qZWN0T2Zmc2V0LCBtb2RlbCwgbW9kZWxPZmZzZXQpOworCisgICAgICAgIGZsb2F0W10gdiA9IG5ldyBmbG9hdFs0XTsKKworICAgICAgICB2WzBdID0gb2JqWDsKKyAgICAgICAgdlsxXSA9IG9ialk7CisgICAgICAgIHZbMl0gPSBvYmpaOworICAgICAgICB2WzNdID0gMS4wZjsKKworICAgICAgICBmbG9hdFtdIHYyID0gbmV3IGZsb2F0WzRdOworCisgICAgICAgIE1hdHJpeC5tdWx0aXBseU1WKHYyLCAwLCBtLCAwLCB2LCAwKTsKKworICAgICAgICBmbG9hdCB3ID0gdjJbM107CisgICAgICAgIGlmICh3ID09IDAuMGYpIHsKKyAgICAgICAgICAgIHJldHVybiBHTDEwLkdMX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgcncgPSAxLjBmIC8gdzsKKworICAgICAgICB3aW5bd2luT2Zmc2V0XSA9CisgICAgICAgICAgICAgICAgdmlld1t2aWV3T2Zmc2V0XSArIHZpZXdbdmlld09mZnNldCArIDJdICogKHYyWzBdICogcncgKyAxLjBmKQorICAgICAgICAgICAgICAgICAgICAgICAgKiAwLjVmOworICAgICAgICB3aW5bd2luT2Zmc2V0ICsgMV0gPQorICAgICAgICAgICAgICAgIHZpZXdbdmlld09mZnNldCArIDFdICsgdmlld1t2aWV3T2Zmc2V0ICsgM10KKyAgICAgICAgICAgICAgICAgICAgICAgICogKHYyWzFdICogcncgKyAxLjBmKSAqIDAuNWY7CisgICAgICAgIHdpblt3aW5PZmZzZXQgKyAyXSA9ICh2MlsyXSAqIHJ3ICsgMS4wZikgKiAwLjVmOworCisgICAgICAgIHJldHVybiBHTDEwLkdMX1RSVUU7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFwIHdpbmRvdyBjb29yZGluYXRlcyB0byBvYmplY3QgY29vcmRpbmF0ZXMuIGdsdVVuUHJvamVjdCBtYXBzIHRoZQorICAgICAqIHNwZWNpZmllZCB3aW5kb3cgY29vcmRpbmF0ZXMgaW50byBvYmplY3QgY29vcmRpbmF0ZXMgdXNpbmcgbW9kZWwsIHByb2osCisgICAgICogYW5kIHZpZXcuIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIG9iai4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgeW91IGNhbiB1c2UgdGhlIE9FU19tYXRyaXhfZ2V0IGV4dGVuc2lvbiwgaWYgcHJlc2VudCwgdG8gZ2V0CisgICAgICogdGhlIGN1cnJlbnQgbW9kZWxWaWV3IGFuZCBwcm9qZWN0aW9uIG1hdHJpY2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSB3aW5YIHdpbmRvdyBjb29yZGluYXRlcyBYCisgICAgICogQHBhcmFtIHdpblkgd2luZG93IGNvb3JkaW5hdGVzIFkKKyAgICAgKiBAcGFyYW0gd2luWiB3aW5kb3cgY29vcmRpbmF0ZXMgWgorICAgICAqIEBwYXJhbSBtb2RlbCB0aGUgY3VycmVudCBtb2RlbHZpZXcgbWF0cml4CisgICAgICogQHBhcmFtIG1vZGVsT2Zmc2V0IHRoZSBvZmZzZXQgaW50byB0aGUgbW9kZWwgYXJyYXkgd2hlcmUgdGhlIG1vZGVsdmlldworICAgICAqICAgICAgICBtYXh0cml4IGRhdGEgc3RhcnRzLgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBjdXJyZW50IHByb2plY3Rpb24gbWF0cml4CisgICAgICogQHBhcmFtIHByb2plY3RPZmZzZXQgdGhlIG9mZnNldCBpbnRvIHRoZSBwcm9qZWN0IGFycmF5IHdoZXJlIHRoZSBwcm9qZWN0CisgICAgICogICAgICAgIG1hdHJpeCBkYXRhIHN0YXJ0cy4KKyAgICAgKiBAcGFyYW0gdmlldyB0aGUgY3VycmVudCB2aWV3LCB7eCwgeSwgd2lkdGgsIGhlaWdodH0KKyAgICAgKiBAcGFyYW0gdmlld09mZnNldCB0aGUgb2Zmc2V0IGludG8gdGhlIHZpZXcgYXJyYXkgd2hlcmUgdGhlIHZpZXcgdmVjdG9yCisgICAgICogICAgICAgIGRhdGEgc3RhcnRzLgorICAgICAqIEBwYXJhbSBvYmogdGhlIG91dHB1dCB2ZWN0b3Ige29ialgsIG9ialksIG9ialp9LCB0aGF0IHJldHVybnMgdGhlCisgICAgICogICAgICAgIGNvbXB1dGVkIG9iamVjdCBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0gb2JqT2Zmc2V0IHRoZSBvZmZzZXQgaW50byB0aGUgb2JqIGFycmF5IHdoZXJlIHRoZSBvYmogdmVjdG9yIGRhdGEKKyAgICAgKiAgICAgICAgc3RhcnRzLgorICAgICAqIEByZXR1cm4gQSByZXR1cm4gdmFsdWUgb2YgR0wxMC5HTF9UUlVFIGluZGljYXRlcyBzdWNjZXNzLCBhIHJldHVybiB2YWx1ZQorICAgICAqICAgICAgICAgb2YgR0wxMC5HTF9GQUxTRSBpbmRpY2F0ZXMgZmFpbHVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnbHVVblByb2plY3QoZmxvYXQgd2luWCwgZmxvYXQgd2luWSwgZmxvYXQgd2luWiwKKyAgICAgICAgICAgIGZsb2F0W10gbW9kZWwsIGludCBtb2RlbE9mZnNldCwgZmxvYXRbXSBwcm9qZWN0LCBpbnQgcHJvamVjdE9mZnNldCwKKyAgICAgICAgICAgIGludFtdIHZpZXcsIGludCB2aWV3T2Zmc2V0LCBmbG9hdFtdIG9iaiwgaW50IG9iak9mZnNldCkgeworICAgICAgICBmbG9hdFtdIHBtID0gbmV3IGZsb2F0WzE2XTsKKyAgICAgICAgTWF0cml4Lm11bHRpcGx5TU0ocG0sIDAsIHByb2plY3QsIHByb2plY3RPZmZzZXQsIG1vZGVsLCBtb2RlbE9mZnNldCk7CisKKyAgICAgICAgZmxvYXRbXSBpbnZQTSA9IG5ldyBmbG9hdFsxNl07CisgICAgICAgIGlmICghTWF0cml4LmludmVydE0oaW52UE0sIDAsIHBtLCAwKSkgeworICAgICAgICAgICAgcmV0dXJuIEdMMTAuR0xfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdFtdIHYgPSBuZXcgZmxvYXRbNF07CisKKyAgICAgICAgdlswXSA9CisgICAgICAgICAgICAgICAgMi4wZiAqICh3aW5YIC0gdmlld1t2aWV3T2Zmc2V0ICsgMF0pIC8gdmlld1t2aWV3T2Zmc2V0ICsgMl0KKyAgICAgICAgICAgICAgICAgICAgICAgIC0gMS4wZjsKKyAgICAgICAgdlsxXSA9CisgICAgICAgICAgICAgICAgMi4wZiAqICh3aW5ZIC0gdmlld1t2aWV3T2Zmc2V0ICsgMV0pIC8gdmlld1t2aWV3T2Zmc2V0ICsgM10KKyAgICAgICAgICAgICAgICAgICAgICAgIC0gMS4wZjsKKyAgICAgICAgdlsyXSA9IDIuMGYgKiB3aW5aIC0gMS4wZjsKKyAgICAgICAgdlszXSA9IDEuMGY7CisKKyAgICAgICAgZmxvYXRbXSB2MiA9IG5ldyBmbG9hdFs0XTsKKworICAgICAgICBNYXRyaXgubXVsdGlwbHlNVih2MiwgMCwgaW52UE0sIDAsIHYsIDApOworCisgICAgICAgIG9ialtvYmpPZmZzZXRdID0gdjJbMF07CisgICAgICAgIG9ialtvYmpPZmZzZXQgKyAxXSA9IHYyWzFdOworICAgICAgICBvYmpbb2JqT2Zmc2V0ICsgMl0gPSB2MlsyXTsKKworICAgICAgICByZXR1cm4gR0wxMC5HTF9UUlVFOworICAgIH0KKworIH0KZGlmZiAtLWdpdCBhL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dMVXRpbHMuamF2YSBiL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dMVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjZjNTU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvR0xVdGlscy5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9wZW5nbDsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CisKKy8qKgorICoKKyAqIFV0aWxpdHkgY2xhc3MgdG8gaGVscCBicmlkZ2luZyBPcGVuR0wgRVMgYW5kIEFuZHJvaWQgQVBJcy4KKyAqCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEdMVXRpbHMgeworCisgICAgLyoKKyAgICAgKiBXZSB1c2UgYSBjbGFzcyBpbml0aWFsaXplciB0byBhbGxvdyB0aGUgbmF0aXZlIGNvZGUgdG8gY2FjaGUgc29tZQorICAgICAqIGZpZWxkIG9mZnNldHMuCisgICAgICovCisgICAgc3RhdGljIHsKKyAgICAgICAgbmF0aXZlQ2xhc3NJbml0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBHTFV0aWxzKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiB0aGUgaW50ZXJuYWwgZm9ybWF0IGFzIGRlZmluZWQgYnkgT3BlbkdMIEVTIG9mIHRoZSBzdXBwbGllZCBiaXRtYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYml0bWFwCisgICAgICogQHJldHVybiB0aGUgaW50ZXJuYWwgZm9ybWF0IG9mIHRoZSBiaXRtYXAuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50ZXJuYWxGb3JtYXQoQml0bWFwIGJpdG1hcCkgeworICAgICAgICBpZiAoYml0bWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZ2V0SW50ZXJuYWxGb3JtYXQgY2FuJ3QgYmUgdXNlZCB3aXRoIGEgbnVsbCBCaXRtYXAiKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGJpdG1hcC5nZXRDb25maWcoKSkgeworICAgICAgICAgICAgY2FzZSBBTFBIQV84OgorICAgICAgICAgICAgICAgIHJldHVybiBHTDEwLkdMX0FMUEhBOworICAgICAgICAgICAgY2FzZSBBUkdCXzQ0NDQ6CisgICAgICAgICAgICBjYXNlIEFSR0JfODg4ODoKKyAgICAgICAgICAgICAgICByZXR1cm4gR0wxMC5HTF9SR0JBOworICAgICAgICAgICAgY2FzZSBSR0JfNTY1OgorICAgICAgICAgICAgICAgIHJldHVybiBHTDEwLkdMX1JHQjsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGludGVybmFsZm9ybWF0Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0eXBlIGFzIGRlZmluZWQgYnkgT3BlbkdMIEVTIG9mIHRoZSBzdXBwbGllZCBiaXRtYXAuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VHlwZShCaXRtYXAgYml0bWFwKSB7CisgICAgICAgIGlmIChiaXRtYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJnZXRUeXBlIGNhbid0IGJlIHVzZWQgd2l0aCBhIG51bGwgQml0bWFwIik7CisgICAgICAgIH0KKyAgICAgICAgaW50IHR5cGU7CisgICAgICAgIHN3aXRjaChiaXRtYXAuZ2V0Q29uZmlnKCkpIHsKKyAgICAgICAgICAgIGNhc2UgQVJHQl80NDQ0OgorICAgICAgICAgICAgICAgIHR5cGUgPSBHTDEwLkdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJHQl81NjU6CisgICAgICAgICAgICAgICAgdHlwZSA9IEdMMTAuR0xfVU5TSUdORURfU0hPUlRfNV82XzU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFMUEhBXzg6CisgICAgICAgICAgICBjYXNlIEFSR0JfODg4ODoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdHlwZSA9IEdMMTAuR0xfVU5TSUdORURfQllURTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxscyBnbFRleEltYWdlMkQoKSBvbiB0aGUgY3VycmVudCBPcGVuR0wgY29udGV4dC4gSWYgbm8gY29udGV4dCBpcworICAgICAqIGN1cnJlbnQgdGhlIGJlaGF2aW9yIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgZ2xUZXhJbWFnZTJEKCkgd2l0aCAgbm8KKyAgICAgKiBjdXJyZW50IGNvbnRleHQsIHRoYXQgaXMsIGVnbEdldEVycm9yKCkgd2lsbCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlCisgICAgICogZXJyb3IuCisgICAgICogVW5saWtlIGdsVGV4SW1hZ2UyRCgpIGJpdG1hcCBjYW5ub3QgYmUgbnVsbCBhbmQgd2lsbCByYWlzZSBhbiBleGNlcHRpb24KKyAgICAgKiBpbiB0aGF0IGNhc2UuCisgICAgICogQWxsIG90aGVyIHBhcmFtZXRlcnMgYXJlIGlkZW50aWNhbCB0byB0aG9zZSB1c2VkIGZvciBnbFRleEltYWdlMkQoKS4KKyAgICAgKgorICAgICAqIE5PVEU6IHRoaXMgbWV0aG9kIGRvZXNuJ3QgY2hhbmdlIEdMX1VOUEFDS19BTElHTk1FTlQsIHlvdSBtdXN0IG1ha2UKKyAgICAgKiBzdXJlIHRvIHNldCBpdCBwcm9wZXJseSBhY2NvcmRpbmcgdG8gdGhlIHN1cHBsaWVkIGJpdG1hcC4KKyAgICAgKgorICAgICAqIFdoZXRoZXIgb3Igbm90IGJpdG1hcCBjYW4gaGF2ZSBub24gcG93ZXIgb2YgdHdvIGRpbWVuc2lvbnMgZGVwZW5kcyBvbgorICAgICAqIHRoZSBjdXJyZW50IE9wZW5HTCBjb250ZXh0LiBBbHdheXMgY2hlY2sgZ2xHZXRFcnJvcigpIHNvbWUgdGltZQorICAgICAqIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGp1c3QgbGlrZSB3aGVuIHVzaW5nIE9wZW5HTCBkaXJlY3RseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQKKyAgICAgKiBAcGFyYW0gbGV2ZWwKKyAgICAgKiBAcGFyYW0gaW50ZXJuYWxmb3JtYXQKKyAgICAgKiBAcGFyYW0gYml0bWFwCisgICAgICogQHBhcmFtIGJvcmRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXhJbWFnZTJEKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IGludGVybmFsZm9ybWF0LAorICAgICAgICAgICAgQml0bWFwIGJpdG1hcCwgaW50IGJvcmRlcikgeworICAgICAgICBpZiAoYml0bWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidGV4SW1hZ2UyRCBjYW4ndCBiZSB1c2VkIHdpdGggYSBudWxsIEJpdG1hcCIpOworICAgICAgICB9CisgICAgICAgIGludCB0eXBlID0gZ2V0VHlwZShiaXRtYXApOworICAgICAgICBpZiAobmF0aXZlX3RleEltYWdlMkQodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIGJpdG1hcCwgdHlwZSwgYm9yZGVyKSE9MCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBCaXRtYXAgZm9ybWF0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHZlcnNpb24gb2YgdGV4SW1hZ2UyRCgpIHRoYXQgdGFrZXMgYW4gZXhwbGljaXQgdHlwZSBwYXJhbWV0ZXIKKyAgICAgKiBhcyBkZWZpbmVkIGJ5IHRoZSBPcGVuR0wgRVMgc3BlY2lmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQKKyAgICAgKiBAcGFyYW0gbGV2ZWwKKyAgICAgKiBAcGFyYW0gaW50ZXJuYWxmb3JtYXQKKyAgICAgKiBAcGFyYW0gYml0bWFwCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiBAcGFyYW0gYm9yZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRleEltYWdlMkQoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgaW50ZXJuYWxmb3JtYXQsCisgICAgICAgICAgICBCaXRtYXAgYml0bWFwLCBpbnQgdHlwZSwgaW50IGJvcmRlcikgeworICAgICAgICBpZiAoYml0bWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidGV4SW1hZ2UyRCBjYW4ndCBiZSB1c2VkIHdpdGggYSBudWxsIEJpdG1hcCIpOworICAgICAgICB9CisgICAgICAgIGlmIChuYXRpdmVfdGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgYml0bWFwLCB0eXBlLCBib3JkZXIpIT0wKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIEJpdG1hcCBmb3JtYXQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdmVyc2lvbiBvZiB0ZXhJbWFnZTJEIHRoYXQgZGV0ZXJtaW5lcyB0aGUgaW50ZXJuYWxGb3JtYXQgYXV0b21hdGljYWxseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQKKyAgICAgKiBAcGFyYW0gbGV2ZWwKKyAgICAgKiBAcGFyYW0gYml0bWFwCisgICAgICogQHBhcmFtIGJvcmRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXhJbWFnZTJEKGludCB0YXJnZXQsIGludCBsZXZlbCwgQml0bWFwIGJpdG1hcCwKKyAgICAgICAgICAgIGludCBib3JkZXIpIHsKKyAgICAgICAgaWYgKGJpdG1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRleEltYWdlMkQgY2FuJ3QgYmUgdXNlZCB3aXRoIGEgbnVsbCBCaXRtYXAiKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgdHlwZSA9IGdldFR5cGUoYml0bWFwKTsKKyAgICAgICAgaWYgKG5hdGl2ZV90ZXhJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIC0xLCBiaXRtYXAsIHR5cGUsIGJvcmRlcikhPTApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgQml0bWFwIGZvcm1hdCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbHMgZ2xUZXhTdWJJbWFnZTJEKCkgb24gdGhlIGN1cnJlbnQgT3BlbkdMIGNvbnRleHQuIElmIG5vIGNvbnRleHQgaXMKKyAgICAgKiBjdXJyZW50IHRoZSBiZWhhdmlvciBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nIGdsVGV4U3ViSW1hZ2UyRCgpIHdpdGggIG5vCisgICAgICogY3VycmVudCBjb250ZXh0LCB0aGF0IGlzLCBlZ2xHZXRFcnJvcigpIHdpbGwgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZQorICAgICAqIGVycm9yLgorICAgICAqIFVubGlrZSBnbFRleFN1YkltYWdlMkQoKSBiaXRtYXAgY2Fubm90IGJlIG51bGwgYW5kIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uCisgICAgICogaW4gdGhhdCBjYXNlLgorICAgICAqIEFsbCBvdGhlciBwYXJhbWV0ZXJzIGFyZSBpZGVudGljYWwgdG8gdGhvc2UgdXNlZCBmb3IgZ2xUZXhTdWJJbWFnZTJEKCkuCisgICAgICoKKyAgICAgKiBOT1RFOiB0aGlzIG1ldGhvZCBkb2Vzbid0IGNoYW5nZSBHTF9VTlBBQ0tfQUxJR05NRU5ULCB5b3UgbXVzdCBtYWtlCisgICAgICogc3VyZSB0byBzZXQgaXQgcHJvcGVybHkgYWNjb3JkaW5nIHRvIHRoZSBzdXBwbGllZCBiaXRtYXAuCisgICAgICoKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCBiaXRtYXAgY2FuIGhhdmUgbm9uIHBvd2VyIG9mIHR3byBkaW1lbnNpb25zIGRlcGVuZHMgb24KKyAgICAgKiB0aGUgY3VycmVudCBPcGVuR0wgY29udGV4dC4gQWx3YXlzIGNoZWNrIGdsR2V0RXJyb3IoKSBzb21lIHRpbWUKKyAgICAgKiBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCBqdXN0IGxpa2Ugd2hlbiB1c2luZyBPcGVuR0wgZGlyZWN0bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0CisgICAgICogQHBhcmFtIGxldmVsCisgICAgICogQHBhcmFtIHhvZmZzZXQKKyAgICAgKiBAcGFyYW0geW9mZnNldAorICAgICAqIEBwYXJhbSBiaXRtYXAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGV4U3ViSW1hZ2UyRChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCB4b2Zmc2V0LCBpbnQgeW9mZnNldCwKKyAgICAgICAgICAgIEJpdG1hcCBiaXRtYXApIHsKKyAgICAgICAgaWYgKGJpdG1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRleFN1YkltYWdlMkQgY2FuJ3QgYmUgdXNlZCB3aXRoIGEgbnVsbCBCaXRtYXAiKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgdHlwZSA9IGdldFR5cGUoYml0bWFwKTsKKyAgICAgICAgaWYgKG5hdGl2ZV90ZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIGJpdG1hcCwgLTEsIHR5cGUpIT0wKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIEJpdG1hcCBmb3JtYXQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdmVyc2lvbiBvZiB0ZXhTdWJJbWFnZTJEKCkgdGhhdCB0YWtlcyBhbiBleHBsaWNpdCB0eXBlIHBhcmFtZXRlcgorICAgICAqIGFzIGRlZmluZWQgYnkgdGhlIE9wZW5HTCBFUyBzcGVjaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldAorICAgICAqIEBwYXJhbSBsZXZlbAorICAgICAqIEBwYXJhbSB4b2Zmc2V0CisgICAgICogQHBhcmFtIHlvZmZzZXQKKyAgICAgKiBAcGFyYW0gYml0bWFwCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGV4U3ViSW1hZ2UyRChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCB4b2Zmc2V0LCBpbnQgeW9mZnNldCwKKyAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAsIGludCBmb3JtYXQsIGludCB0eXBlKSB7CisgICAgICAgIGlmIChiaXRtYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0ZXhTdWJJbWFnZTJEIGNhbid0IGJlIHVzZWQgd2l0aCBhIG51bGwgQml0bWFwIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hdGl2ZV90ZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIGJpdG1hcCwgZm9ybWF0LCB0eXBlKSE9MCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBCaXRtYXAgZm9ybWF0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuYXRpdmUgcHJpdmF0ZSBzdGF0aWMgdm9pZCBuYXRpdmVDbGFzc0luaXQoKTsKKworICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyBpbnQgbmF0aXZlX3RleEltYWdlMkQoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgaW50ZXJuYWxmb3JtYXQsCisgICAgICAgICAgICBCaXRtYXAgYml0bWFwLCBpbnQgdHlwZSwgaW50IGJvcmRlcik7CisgICAgbmF0aXZlIHByaXZhdGUgc3RhdGljIGludCBuYXRpdmVfdGV4U3ViSW1hZ2UyRChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCB4b2Zmc2V0LCBpbnQgeW9mZnNldCwKKyAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAsIGludCBmb3JtYXQsIGludCB0eXBlKTsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dMV3JhcHBlckJhc2UuamF2YSBiL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dMV3JhcHBlckJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjdmOTVmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvR0xXcmFwcGVyQmFzZS5qYXZhCkBAIC0wLDAgKzEsNDk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9wZW5nbDsKKworaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5GbG9hdEJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5JbnRCdWZmZXI7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwRXh0OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTE7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMUV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExRXh0ZW5zaW9uUGFjazsKKworLyoqCisgKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYSBHTCB3cmFwcGVyLiBQcm92aWRlcworICogc29tZSBjb252ZW5pZW50IGluc3RhbmNlIHZhcmlhYmxlcyBhbmQgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMuCisgKi8KK2Fic3RyYWN0IGNsYXNzIEdMV3JhcHBlckJhc2UKKyAgICBpbXBsZW1lbnRzIEdMLCBHTDEwLCBHTDEwRXh0LCBHTDExLCBHTDExRXh0IHsKKwlwdWJsaWMgR0xXcmFwcGVyQmFzZShHTCBnbCkgeworCQltZ2wgPSAoR0wxMCkgZ2w7CisJCWlmIChnbCBpbnN0YW5jZW9mIEdMMTBFeHQpIHsKKwkJCW1nbDEwRXh0ID0gKEdMMTBFeHQpIGdsOworCQl9CisJCWlmIChnbCBpbnN0YW5jZW9mIEdMMTEpIHsKKwkJCW1nbDExID0gKEdMMTEpIGdsOworCQl9CisJCWlmIChnbCBpbnN0YW5jZW9mIEdMMTFFeHQpIHsKKwkJCW1nbDExRXh0ID0gKEdMMTFFeHQpIGdsOworCQl9CisJCWlmIChnbCBpbnN0YW5jZW9mIEdMMTFFeHRlbnNpb25QYWNrKSB7CisJCQltZ2wxMUV4dGVuc2lvblBhY2sgPSAoR0wxMUV4dGVuc2lvblBhY2spIGdsOworCQl9CisJfQorCQorCXByb3RlY3RlZCBHTDEwIG1nbDsKKwlwcm90ZWN0ZWQgR0wxMEV4dCBtZ2wxMEV4dDsKKwlwcm90ZWN0ZWQgR0wxMSBtZ2wxMTsKKwlwcm90ZWN0ZWQgR0wxMUV4dCBtZ2wxMUV4dDsKKwlwcm90ZWN0ZWQgR0wxMUV4dGVuc2lvblBhY2sgbWdsMTFFeHRlbnNpb25QYWNrOworCisgICAgLy8gVW5zdXBwb3J0ZWQgR0wxMSBtZXRob2RzCisKKyAgICBwdWJsaWMgdm9pZCBnbEdldFBvaW50ZXJ2KGludCBwbmFtZSwgamF2YS5uaW8uQnVmZmVyW10gcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8vIFZCTyB2ZXJzaW9ucyBvZiAqUG9pbnRlciBhbmQgKkVsZW1lbnRzIG1ldGhvZHMKKyAgICBwdWJsaWMgdm9pZCBnbENvbG9yUG9pbnRlcihpbnQgc2l6ZSwgaW50IHR5cGUsIGludCBzdHJpZGUsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xOb3JtYWxQb2ludGVyKGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4Q29vcmRQb2ludGVyKGludCBzaXplLCBpbnQgdHlwZSwgaW50IHN0cmlkZSwgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFZlcnRleFBvaW50ZXIoaW50IHNpemUsIGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRHJhd0VsZW1lbnRzKGludCBtb2RlLCBpbnQgY291bnQsIGludCB0eXBlLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQmluZEJ1ZmZlcihpbnQgdGFyZ2V0LCBpbnQgYnVmZmVyKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQnVmZmVyRGF0YShpbnQgdGFyZ2V0LCBpbnQgc2l6ZSwgQnVmZmVyIGRhdGEsIGludCB1c2FnZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEJ1ZmZlclN1YkRhdGEoaW50IHRhcmdldCwgaW50IG9mZnNldCwgaW50IHNpemUsIEJ1ZmZlciBkYXRhKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ29sb3I0dWIoYnl0ZSByZWQsIGJ5dGUgZ3JlZW4sIGJ5dGUgYmx1ZSwgYnl0ZSBhbHBoYSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERlbGV0ZUJ1ZmZlcnMoaW50IG4sIGludFtdIGJ1ZmZlcnMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xEZWxldGVCdWZmZXJzKGludCBuLCBJbnRCdWZmZXIgYnVmZmVycykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdlbkJ1ZmZlcnMoaW50IG4sIGludFtdIGJ1ZmZlcnMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZW5CdWZmZXJzKGludCBuLCBJbnRCdWZmZXIgYnVmZmVycykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldEJvb2xlYW52KGludCBwbmFtZSwgYm9vbGVhbltdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldEJvb2xlYW52KGludCBwbmFtZSwgSW50QnVmZmVyIHBhcmFtcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldEJ1ZmZlclBhcmFtZXRlcml2KGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBJbnRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0Q2xpcFBsYW5lZihpbnQgcG5hbWUsIGZsb2F0W10gZXFuLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0Q2xpcFBsYW5lZihpbnQgcG5hbWUsIEZsb2F0QnVmZmVyIGVxbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldENsaXBQbGFuZXgoaW50IHBuYW1lLCBpbnRbXSBlcW4sIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRDbGlwUGxhbmV4KGludCBwbmFtZSwgSW50QnVmZmVyIGVxbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldEZpeGVkdihpbnQgcG5hbWUsIGludFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldEZpeGVkdihpbnQgcG5hbWUsIEludEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRGbG9hdHYoaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldEZsb2F0dihpbnQgcG5hbWUsIEZsb2F0QnVmZmVyIHBhcmFtcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldExpZ2h0ZnYoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0TGlnaHRmdihpbnQgbGlnaHQsIGludCBwbmFtZSwgRmxvYXRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0TGlnaHR4dihpbnQgbGlnaHQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0TGlnaHR4dihpbnQgbGlnaHQsIGludCBwbmFtZSwgSW50QnVmZmVyIHBhcmFtcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldE1hdGVyaWFsZnYoaW50IGZhY2UsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRNYXRlcmlhbGZ2KGludCBmYWNlLCBpbnQgcG5hbWUsIEZsb2F0QnVmZmVyIHBhcmFtcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldE1hdGVyaWFseHYoaW50IGZhY2UsIGludCBwbmFtZSwgaW50W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0TWF0ZXJpYWx4dihpbnQgZmFjZSwgaW50IHBuYW1lLCBJbnRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0VGV4RW52aXYoaW50IGVudiwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRUZXhFbnZpdihpbnQgZW52LCBpbnQgcG5hbWUsIEludEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRUZXhFbnZ4dihpbnQgZW52LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldFRleEVudnh2KGludCBlbnYsIGludCBwbmFtZSwgSW50QnVmZmVyIHBhcmFtcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldFRleFBhcmFtZXRlcmZ2KGludCB0YXJnZXQsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJmdihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIEZsb2F0QnVmZmVyIHBhcmFtcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldFRleFBhcmFtZXRlcml2KGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyaXYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBJbnRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyeHYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJ4dihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIEludEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2xJc0J1ZmZlcihpbnQgYnVmZmVyKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdsSXNFbmFibGVkKGludCBjYXApIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2xJc1RleHR1cmUoaW50IHRleHR1cmUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xQb2ludFBhcmFtZXRlcmYoaW50IHBuYW1lLCBmbG9hdCBwYXJhbSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFBvaW50UGFyYW1ldGVyZnYoaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFBvaW50UGFyYW1ldGVyZnYoaW50IHBuYW1lLCBGbG9hdEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xQb2ludFBhcmFtZXRlcngoaW50IHBuYW1lLCBpbnQgcGFyYW0pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xQb2ludFBhcmFtZXRlcnh2KGludCBwbmFtZSwgaW50W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJ4dihpbnQgcG5hbWUsIEludEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xQb2ludFNpemVQb2ludGVyT0VTKGludCB0eXBlLCBpbnQgc3RyaWRlLCBCdWZmZXIgcG9pbnRlcikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleEVudmkoaW50IHRhcmdldCwgaW50IHBuYW1lLCBpbnQgcGFyYW0pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xUZXhFbnZpdihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleEVudml2KGludCB0YXJnZXQsIGludCBwbmFtZSwgSW50QnVmZmVyIHBhcmFtcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleFBhcmFtZXRlcmZ2KGludCB0YXJnZXQsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xUZXhQYXJhbWV0ZXJmdihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIEZsb2F0QnVmZmVyIHBhcmFtcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleFBhcmFtZXRlcmkoaW50IHRhcmdldCwgaW50IHBuYW1lLCBpbnQgcGFyYW0pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xUZXhQYXJhbWV0ZXJ4dihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleFBhcmFtZXRlcnh2KGludCB0YXJnZXQsIGludCBwbmFtZSwgSW50QnVmZmVyIHBhcmFtcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvLyBVbnN1cHBvcnRlZCBHTDExRXh0IG1ldGhvZHMKKworICAgIHB1YmxpYyB2b2lkIGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMoaW50IG1hdHJpeHBhbGV0dGVpbmRleCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUygpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMoaW50IHNpemUsIGludCB0eXBlLCBpbnQgc3RyaWRlLCBCdWZmZXIgcG9pbnRlcikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbE1hdHJpeEluZGV4UG9pbnRlck9FUyhpbnQgc2l6ZSwgaW50IHR5cGUsIGludCBzdHJpZGUsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xXZWlnaHRQb2ludGVyT0VTKGludCBzaXplLCBpbnQgdHlwZSwgaW50IHN0cmlkZSwgQnVmZmVyIHBvaW50ZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xXZWlnaHRQb2ludGVyT0VTKGludCBzaXplLCBpbnQgdHlwZSwgaW50IHN0cmlkZSwgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvLyBVbnN1cHBvcnRlZCBHTDExRXh0ZW5zaW9uUGFjayBtZXRob2RzCisKKyAgICBwdWJsaWMgdm9pZCBnbEJpbmRGcmFtZWJ1ZmZlck9FUyhpbnQgdGFyZ2V0LCBpbnQgZnJhbWVidWZmZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xCaW5kUmVuZGVyYnVmZmVyT0VTKGludCB0YXJnZXQsIGludCByZW5kZXJidWZmZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xCbGVuZEVxdWF0aW9uKGludCBtb2RlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlKGludCBtb2RlUkdCLCBpbnQgbW9kZUFscGhhKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQmxlbmRGdW5jU2VwYXJhdGUoaW50IHNyY1JHQiwgaW50IGRzdFJHQiwgaW50IHNyY0FscGhhLCBpbnQgZHN0QWxwaGEpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgaW50IGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUyhpbnQgdGFyZ2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsQ29tcHJlc3NlZFRleEltYWdlMkQoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgaW50ZXJuYWxmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJvcmRlciwgaW50IGltYWdlU2l6ZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERlbGV0ZUZyYW1lYnVmZmVyc09FUyhpbnQgbiwgaW50W10gZnJhbWVidWZmZXJzLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTKGludCBuLCBqYXZhLm5pby5JbnRCdWZmZXIgZnJhbWVidWZmZXJzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUyhpbnQgbiwgaW50W10gcmVuZGVyYnVmZmVycywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMoaW50IG4sIGphdmEubmlvLkludEJ1ZmZlciByZW5kZXJidWZmZXJzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMoaW50IHRhcmdldCwgaW50IGF0dGFjaG1lbnQsIGludCByZW5kZXJidWZmZXJ0YXJnZXQsIGludCByZW5kZXJidWZmZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUyhpbnQgdGFyZ2V0LCBpbnQgYXR0YWNobWVudCwgaW50IHRleHRhcmdldCwgaW50IHRleHR1cmUsIGludCBsZXZlbCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdlbmVyYXRlTWlwbWFwT0VTKGludCB0YXJnZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMoaW50IG4sIGludFtdIGZyYW1lYnVmZmVycywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdlbkZyYW1lYnVmZmVyc09FUyhpbnQgbiwgamF2YS5uaW8uSW50QnVmZmVyIGZyYW1lYnVmZmVycykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdlblJlbmRlcmJ1ZmZlcnNPRVMoaW50IG4sIGludFtdIHJlbmRlcmJ1ZmZlcnMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZW5SZW5kZXJidWZmZXJzT0VTKGludCBuLCBqYXZhLm5pby5JbnRCdWZmZXIgcmVuZGVyYnVmZmVycykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTKGludCB0YXJnZXQsIGludCBhdHRhY2htZW50LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTKGludCB0YXJnZXQsIGludCBhdHRhY2htZW50LCBpbnQgcG5hbWUsIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyhpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTKGludCB0YXJnZXQsIGludCBwbmFtZSwgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldFRleEdlbmZ2KGludCBjb29yZCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbEdldFRleEdlbmZ2KGludCBjb29yZCwgaW50IHBuYW1lLCBqYXZhLm5pby5GbG9hdEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRUZXhHZW5pdihpbnQgY29vcmQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0VGV4R2VuaXYoaW50IGNvb3JkLCBpbnQgcG5hbWUsIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xHZXRUZXhHZW54dihpbnQgY29vcmQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsR2V0VGV4R2VueHYoaW50IGNvb3JkLCBpbnQgcG5hbWUsIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2xJc0ZyYW1lYnVmZmVyT0VTKGludCBmcmFtZWJ1ZmZlcikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnbElzUmVuZGVyYnVmZmVyT0VTKGludCByZW5kZXJidWZmZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTKGludCB0YXJnZXQsIGludCBpbnRlcm5hbGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4R2VuZihpbnQgY29vcmQsIGludCBwbmFtZSwgZmxvYXQgcGFyYW0pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xUZXhHZW5mdihpbnQgY29vcmQsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2xUZXhHZW5mdihpbnQgY29vcmQsIGludCBwbmFtZSwgamF2YS5uaW8uRmxvYXRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4R2VuaShpbnQgY29vcmQsIGludCBwbmFtZSwgaW50IHBhcmFtKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4R2VuaXYoaW50IGNvb3JkLCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleEdlbml2KGludCBjb29yZCwgaW50IHBuYW1lLCBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4R2VueChpbnQgY29vcmQsIGludCBwbmFtZSwgaW50IHBhcmFtKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdsVGV4R2VueHYoaW50IGNvb3JkLCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcywgaW50IG9mZnNldCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnbFRleEdlbnh2KGludCBjb29yZCwgaW50IHBuYW1lLCBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dyb3VwLmphdmEgYi9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9Hcm91cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZjI5NTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9Hcm91cC5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9wZW5nbDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLlNob3J0QnVmZmVyOworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuKjsKKworY2xhc3MgTWF0ZXJpYWxJbmRpY2VzIHsKKworICAgIHByaXZhdGUgTWF0ZXJpYWwgbWF0ZXJpYWwgPSBudWxsOworICAgIHByaXZhdGUgU2hvcnRCdWZmZXIgaW5kZXhCdWZmZXIgPSBudWxsOworCisgICAgcHVibGljIE1hdGVyaWFsSW5kaWNlcyhNYXRlcmlhbCBtYXRlcmlhbCwgU2hvcnRCdWZmZXIgaW5kZXhCdWZmZXIpIHsKKyAgICAgICAgdGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsOworICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gaW5kZXhCdWZmZXI7CisgICAgfQorCisgICAgcHVibGljIE1hdGVyaWFsIGdldE1hdGVyaWFsKCkgeworICAgICAgICByZXR1cm4gbWF0ZXJpYWw7CisgICAgfQorCisgICAgcHVibGljIFNob3J0QnVmZmVyIGdldEluZGV4QnVmZmVyKCkgeworICAgICAgICByZXR1cm4gaW5kZXhCdWZmZXI7CisgICAgfQorfQorCisvKioKKyAqIHtAaGlkZX0KKyAqLworcHVibGljIGNsYXNzIEdyb3VwIHsKKworICAgIHByaXZhdGUgT2JqZWN0M0QgcGFyZW50OworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBwcml2YXRlIExpc3Q8TWF0ZXJpYWxJbmRpY2VzPiBtYXRlcmlhbEluZGljZXMgPQorICAgICAgICBuZXcgQXJyYXlMaXN0PE1hdGVyaWFsSW5kaWNlcz4oKTsKKworICAgIHB1YmxpYyBHcm91cChPYmplY3QzRCBwYXJlbnQpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkKERhdGFJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGRpcy5yZWFkSW50KCk7IC8vIG5hbWUgbGVuZ3RoCisgICAgICAgIHRoaXMubmFtZSA9IGRpcy5yZWFkVVRGKCk7CisKKyAgICAgICAgaW50IG51bU1hdGVyaWFscyA9IGRpcy5yZWFkSW50KCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1NYXRlcmlhbHM7IGkrKykgeworICAgICAgICAgICAgZGlzLnJlYWRJbnQoKTsgLy8gbWF0ZXJpYWwgbmFtZSBsZW5ndGgKKyAgICAgICAgICAgIFN0cmluZyBtYXROYW1lID0gZGlzLnJlYWRVVEYoKTsKKyAgICAgICAgICAgIE1hdGVyaWFsIG1hdGVyaWFsID0gcGFyZW50LmdldE1hdGVyaWFsKG1hdE5hbWUpOworCisgICAgICAgICAgICBpbnQgbnVtSW5kaWNlcyA9IGRpcy5yZWFkSW50KCk7CisgICAgICAgICAgICBieXRlW10gaW5kaWNlc0J5dGVzID0gbmV3IGJ5dGVbbnVtSW5kaWNlcyAqIDJdOworICAgICAgICAgICAgZGlzLnJlYWRGdWxseShpbmRpY2VzQnl0ZXMpOworCisgICAgICAgICAgICAvLyBTd2FwIGJ5dGVzIGZyb20gbmV0d29yayB0byBuYXRpdmUgb3JkZXIgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICBpZiAoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkgPT0gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bUluZGljZXM7IGorKykgeworICAgICAgICAgICAgICAgICAgICBieXRlIGIwID0gaW5kaWNlc0J5dGVzW2lkeF07CisgICAgICAgICAgICAgICAgICAgIGJ5dGUgYjEgPSBpbmRpY2VzQnl0ZXNbaWR4ICsgMV07CisgICAgICAgICAgICAgICAgICAgIGluZGljZXNCeXRlc1tpZHhdID0gYjE7CisgICAgICAgICAgICAgICAgICAgIGluZGljZXNCeXRlc1tpZHggKyAxXSA9IGIwOworICAgICAgICAgICAgICAgICAgICBpZHggKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgaWJiID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdCgyKm51bUluZGljZXMpOworICAgICAgICAgICAgaWJiLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKKyAgICAgICAgICAgIGliYi5wdXQoaW5kaWNlc0J5dGVzKTsKKyAgICAgICAgICAgIGliYi5wb3NpdGlvbigwKTsKKworICAgICAgICAgICAgU2hvcnRCdWZmZXIgc2IgPSBpYmIuYXNTaG9ydEJ1ZmZlcigpOworICAgICAgICAgICAgbWF0ZXJpYWxJbmRpY2VzLmFkZChuZXcgTWF0ZXJpYWxJbmRpY2VzKG1hdGVyaWFsLCBzYikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXROdW1UcmlhbmdsZXMoKSB7CisgICAgICAgIGludCBudW1UcmlhbmdsZXMgPSAwOworICAgICAgICBJdGVyYXRvcjxNYXRlcmlhbEluZGljZXM+IGl0ZXIgPSBtYXRlcmlhbEluZGljZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBNYXRlcmlhbEluZGljZXMgbWF0SWR4ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBTaG9ydEJ1ZmZlciBpbmRleEJ1ZmZlciA9IG1hdElkeC5nZXRJbmRleEJ1ZmZlcigpOworICAgICAgICAgICAgbnVtVHJpYW5nbGVzICs9IGluZGV4QnVmZmVyLmNhcGFjaXR5KCkvMzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVtVHJpYW5nbGVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRyYXcoR0wxMCBnbCkgeworICAgICAgICBnbC5nbERpc2FibGVDbGllbnRTdGF0ZShnbC5HTF9DT0xPUl9BUlJBWSk7CisKKyAgICAgICAgZ2wuZ2xWZXJ0ZXhQb2ludGVyKDMsIGdsLkdMX0ZJWEVELCAwLCBwYXJlbnQuZ2V0VmVydGV4QnVmZmVyKCkpOworICAgICAgICBnbC5nbEVuYWJsZUNsaWVudFN0YXRlKGdsLkdMX1ZFUlRFWF9BUlJBWSk7CisKKyAgICAgICAgZ2wuZ2xOb3JtYWxQb2ludGVyKGdsLkdMX0ZJWEVELCAwLCBwYXJlbnQuZ2V0Tm9ybWFsQnVmZmVyKCkpOworICAgICAgICBnbC5nbEVuYWJsZUNsaWVudFN0YXRlKGdsLkdMX05PUk1BTF9BUlJBWSk7CisKKyAgICAgICAgaWYgKHBhcmVudC5oYXNUZXhjb29yZHMoKSkgeworICAgICAgICAgICAgZ2wuZ2xUZXhDb29yZFBvaW50ZXIoMiwgZ2wuR0xfRklYRUQsIDAsIHBhcmVudC5nZXRUZXhjb29yZEJ1ZmZlcigpKTsKKyAgICAgICAgICAgIGdsLmdsRW5hYmxlQ2xpZW50U3RhdGUoZ2wuR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7CisgICAgICAgICAgICBnbC5nbEVuYWJsZShnbC5HTF9URVhUVVJFXzJEKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdsLmdsRGlzYWJsZShnbC5HTF9URVhUVVJFXzJEKTsKKyAgICAgICAgfQorCisgICAgICAgIEl0ZXJhdG9yPE1hdGVyaWFsSW5kaWNlcz4gaXRlciA9IG1hdGVyaWFsSW5kaWNlcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIE1hdGVyaWFsSW5kaWNlcyBtYXRJZHggPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIFNob3J0QnVmZmVyIGluZGV4QnVmZmVyID0gbWF0SWR4LmdldEluZGV4QnVmZmVyKCk7CisgICAgICAgICAgICBNYXRlcmlhbCBtYXQgPSBtYXRJZHguZ2V0TWF0ZXJpYWwoKTsKKyAgICAgICAgICAgIG1hdC5zZXRNYXRlcmlhbFBhcmFtZXRlcnMoZ2wpOworICAgICAgICAgICAgaWYgKHBhcmVudC5oYXNUZXhjb29yZHMoKSAmJiBtYXQuZ2V0TWFwX0tkKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgVGV4dHVyZSB0ZXh0dXJlID0gcGFyZW50LmdldFRleHR1cmUobWF0LmdldE1hcF9LZCgpKTsKKyAgICAgICAgICAgICAgICB0ZXh0dXJlLnNldFRleHR1cmVQYXJhbWV0ZXJzKGdsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ2wuZ2xEcmF3RWxlbWVudHMoZ2wuR0xfVFJJQU5HTEVTLAorICAgICAgICAgICAgICAgICAgICBpbmRleEJ1ZmZlci5jYXBhY2l0eSgpLAorICAgICAgICAgICAgICAgICAgICBnbC5HTF9VTlNJR05FRF9TSE9SVCwKKyAgICAgICAgICAgICAgICAgICAgaW5kZXhCdWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJHcm91cFsiICsKKyAgICAgICAgIm5hbWU9IiArIG5hbWUgKworICAgICAgICAiXSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvTWF0ZXJpYWwuamF2YSBiL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL01hdGVyaWFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhM2U3MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL01hdGVyaWFsLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQub3BlbmdsOworCitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcHVibGljIGNsYXNzIE1hdGVyaWFsIHsKKworICAgIHByaXZhdGUgT2JqZWN0M0QgcGFyZW50OworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbWFwX2tkOworICAgIHByaXZhdGUgZmxvYXRbXSBrYSA9IG5ldyBmbG9hdFs0XTsKKyAgICBwcml2YXRlIGZsb2F0W10ga2QgPSBuZXcgZmxvYXRbNF07CisgICAgcHJpdmF0ZSBmbG9hdFtdIGtzID0gbmV3IGZsb2F0WzRdOworICAgIHByaXZhdGUgZmxvYXQgbnM7CisgICAgcHJpdmF0ZSBpbnQgaWxsdW07CisgICAgcHJpdmF0ZSBmbG9hdCBkOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXRbXSBibGFjayA9IHsgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiB9OworCisgICAgcHVibGljIE1hdGVyaWFsKE9iamVjdDNEIHBhcmVudCkgeworICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFwX0tkKCkgeworICAgICAgICByZXR1cm4gbWFwX2tkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1hdGVyaWFsUGFyYW1ldGVycyhHTDEwIGdsKSB7CisgICAgICAgIGdsLmdsTWF0ZXJpYWxmdihnbC5HTF9GUk9OVF9BTkRfQkFDSywgZ2wuR0xfQU1CSUVOVCwga2QsIDApOworICAgICAgICBnbC5nbE1hdGVyaWFsZnYoZ2wuR0xfRlJPTlRfQU5EX0JBQ0ssIGdsLkdMX0RJRkZVU0UsIGtkLCAwKTsKKyAgICAgICAgZ2wuZ2xNYXRlcmlhbGZ2KGdsLkdMX0ZST05UX0FORF9CQUNLLCBnbC5HTF9TUEVDVUxBUiwga3MsIDApOworICAgICAgICBnbC5nbE1hdGVyaWFsZihnbC5HTF9GUk9OVF9BTkRfQkFDSywgZ2wuR0xfU0hJTklORVNTLAorICAgICAgICAgICAgICAgIE1hdGgubWluKE1hdGgubWF4KG5zLCAwKSwgMTI4KSk7CisKKy8vICAgICAgaWYgKGlsbHVtID09IDApIHsKKy8vICAgICAgZ2wuZ2xNYXRlcmlhbGZ2KGdsLkdMX0ZST05UX0FORF9CQUNLLCBnbC5HTF9BTUJJRU5ULCBrZCwgMCk7CisvLyAgICAgIH0gZWxzZSB7CisvLyAgICAgIGdsLmdsTWF0ZXJpYWxmdihnbC5HTF9GUk9OVF9BTkRfQkFDSywgZ2wuR0xfQU1CSUVOVCwga2EsIDApOworLy8gICAgICBnbC5nbE1hdGVyaWFsZnYoZ2wuR0xfRlJPTlRfQU5EX0JBQ0ssIGdsLkdMX0RJRkZVU0UsIGtkLCAwKTsKKy8vICAgICAgfQorCisvLyAgICAgIGlmIChpbGx1bSA+IDEpIHsKKy8vICAgICAgZ2wuZ2xNYXRlcmlhbGZ2KGdsLkdMX0ZST05UX0FORF9CQUNLLCBnbC5HTF9TUEVDVUxBUiwga3MsIDApOworLy8gICAgICBnbC5nbE1hdGVyaWFsZihnbC5HTF9GUk9OVF9BTkRfQkFDSywgZ2wuR0xfU0hJTklORVNTLAorLy8gICAgICBNYXRoLm1pbihNYXRoLm1heChucywgMCksIDEyOCkpOworLy8gICAgICB9IGVsc2UgeworLy8gICAgICBnbC5nbE1hdGVyaWFsZnYoZ2wuR0xfRlJPTlRfQU5EX0JBQ0ssIGdsLkdMX1NQRUNVTEFSLCBibGFjaywgMCk7CisvLyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkKERhdGFJbnB1dFN0cmVhbSBkaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGRpcy5yZWFkSW50KCk7IC8vIG5hbWUgbGVuZ3RoCisgICAgICAgIHRoaXMubmFtZSA9IGRpcy5yZWFkVVRGKCk7CisKKyAgICAgICAgZGlzLnJlYWRJbnQoKTsgLy8gbWFwX2tkTGVuZ3RoCisgICAgICAgIHRoaXMubWFwX2tkID0gZGlzLnJlYWRVVEYoKTsKKworICAgICAgICBpZiAocGFyZW50Lmhhc1RleGNvb3JkcygpICYmIG1hcF9rZC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHBhcmVudC5sb2FkVGV4dHVyZShtYXBfa2QpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5rYVswXSA9IGRpcy5yZWFkRmxvYXQoKTsKKyAgICAgICAgdGhpcy5rYVsxXSA9IGRpcy5yZWFkRmxvYXQoKTsKKyAgICAgICAgdGhpcy5rYVsyXSA9IGRpcy5yZWFkRmxvYXQoKTsKKyAgICAgICAgdGhpcy5rYVszXSA9IGRpcy5yZWFkRmxvYXQoKTsKKworICAgICAgICB0aGlzLmtkWzBdID0gZGlzLnJlYWRGbG9hdCgpOworICAgICAgICB0aGlzLmtkWzFdID0gZGlzLnJlYWRGbG9hdCgpOworICAgICAgICB0aGlzLmtkWzJdID0gZGlzLnJlYWRGbG9hdCgpOworICAgICAgICB0aGlzLmtkWzNdID0gZGlzLnJlYWRGbG9hdCgpOworCisgICAgICAgIHRoaXMua3NbMF0gPSBkaXMucmVhZEZsb2F0KCk7CisgICAgICAgIHRoaXMua3NbMV0gPSBkaXMucmVhZEZsb2F0KCk7CisgICAgICAgIHRoaXMua3NbMl0gPSBkaXMucmVhZEZsb2F0KCk7CisgICAgICAgIHRoaXMua3NbM10gPSBkaXMucmVhZEZsb2F0KCk7CisKKyAgICAgICAgdGhpcy5ucyA9IGRpcy5yZWFkRmxvYXQoKTsKKyAgICAgICAgdGhpcy5pbGx1bSA9IGRpcy5yZWFkSW50KCk7CisgICAgICAgIHRoaXMuZCA9IGRpcy5yZWFkRmxvYXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIk1hdGVyaWFsWyIgKworICAgICAgICAibmFtZT1cIiIgKyBuYW1lICsgIlwiLCIgKworICAgICAgICAia2E9eyIgKyBrYVswXSArICIsIiArIGthWzFdICsgIiwiICsga2FbMl0gKyAifSwiICsKKyAgICAgICAgImtkPXsiICsga2RbMF0gKyAiLCIgKyBrZFsxXSArICIsIiArIGtkWzJdICsgIn0sIiArCisgICAgICAgICJrcz17IiArIGtzWzBdICsgIiwiICsga3NbMV0gKyAiLCIgKyBrc1syXSArICJ9LCIgKworICAgICAgICAibnM9IiArIG5zICsgIiwiICsKKyAgICAgICAgIm1hcF9rZD1cIiIgKyAKKyAgICAgICAgKG1hcF9rZCA9PSBudWxsID8gIiIgOiBtYXBfa2QpICsKKyAgICAgICAgIlwiLCIgKworICAgICAgICAiaWxsdW09IiArIGlsbHVtICsgIiwiICsKKyAgICAgICAgImQ9IiArIGQgKworICAgICAgICAiXSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvTWF0cml4LmphdmEgYi9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9NYXRyaXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2JhMzZlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvTWF0cml4LmphdmEKQEAgLTAsMCArMSw1ODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQub3BlbmdsOworCisvKioKKyAqIE1hdHJpeCBtYXRoIHV0aWxpdGllcy4gVGhlc2UgbWV0aG9kcyBvcGVyYXRlIG9uIE9wZW5HTCBFUyBmb3JtYXQKKyAqIG1hdHJpY2VzIGFuZCB2ZWN0b3JzIHN0b3JlZCBpbiBmbG9hdCBhcnJheXMuCisgKgorICogTWF0cmljZXMgYXJlIDQgeCA0IGNvbHVtbi12ZWN0b3IgbWF0cmljZXMgc3RvcmVkIGluIGNvbHVtbi1tYWpvcgorICogb3JkZXI6CisgKiA8cHJlPgorICogIG1bb2Zmc2V0ICsgIDBdIG1bb2Zmc2V0ICsgIDRdIG1bb2Zmc2V0ICsgIDhdIG1bb2Zmc2V0ICsgMTJdCisgKiAgbVtvZmZzZXQgKyAgMV0gbVtvZmZzZXQgKyAgNV0gbVtvZmZzZXQgKyAgOV0gbVtvZmZzZXQgKyAxM10KKyAqICBtW29mZnNldCArICAyXSBtW29mZnNldCArICA2XSBtW29mZnNldCArIDEwXSBtW29mZnNldCArIDE0XQorICogIG1bb2Zmc2V0ICsgIDNdIG1bb2Zmc2V0ICsgIDddIG1bb2Zmc2V0ICsgMTFdIG1bb2Zmc2V0ICsgMTVdCisgKiA8L3ByZT4KKyAqCisgKiBWZWN0b3JzIGFyZSA0IHJvdyB4IDEgY29sdW1uIGNvbHVtbi12ZWN0b3JzIHN0b3JlZCBpbiBvcmRlcjoKKyAqIDxwcmU+CisgKiB2W29mZnNldCArIDBdCisgKiB2W29mZnNldCArIDFdCisgKiB2W29mZnNldCArIDJdCisgKiB2W29mZnNldCArIDNdCisgKiA8L3ByZT4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBNYXRyaXggeworICAgIC8qKgorICAgICAqIE11bHRpcGx5IHR3byA0eDQgbWF0cmljZXMgdG9nZXRoZXIgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gYSB0aGlyZCA0eDQKKyAgICAgKiBtYXRyaXguIEluIG1hdHJpeCBub3RhdGlvbjogcmVzdWx0ID0gbGhzIHggcmhzLiBEdWUgdG8gdGhlIHdheQorICAgICAqIG1hdHJpeCBtdWx0aXBsaWNhdGlvbiB3b3JrcywgdGhlIHJlc3VsdCBtYXRyaXggd2lsbCBoYXZlIHRoZSBzYW1lCisgICAgICogZWZmZWN0IGFzIGZpcnN0IG11bHRpcGx5aW5nIGJ5IHRoZSByaHMgbWF0cml4LCB0aGVuIG11bHRpcGx5aW5nIGJ5CisgICAgICogdGhlIGxocyBtYXRyaXguIFRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIHdoYXQgeW91IG1pZ2h0IGV4cGVjdC4KKyAgICAgKgorICAgICAqIFRoZSBzYW1lIGZsb2F0IGFycmF5IG1heSBiZSBwYXNzZWQgZm9yIHJlc3VsdCwgbGhzLCBhbmQvb3IgcmhzLiBIb3dldmVyLAorICAgICAqIHRoZSByZXN1bHQgZWxlbWVudCB2YWx1ZXMgYXJlIHVuZGVmaW5lZCBpZiB0aGUgcmVzdWx0IGVsZW1lbnRzIG92ZXJsYXAKKyAgICAgKiBlaXRoZXIgdGhlIGxocyBvciByaHMgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzdWx0IFRoZSBmbG9hdCBhcnJheSB0aGF0IGhvbGRzIHRoZSByZXN1bHQuCisgICAgICogQHBhcmFtIHJlc3VsdE9mZnNldCBUaGUgb2Zmc2V0IGludG8gdGhlIHJlc3VsdCBhcnJheSB3aGVyZSB0aGUgcmVzdWx0IGlzCisgICAgICogICAgICAgIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gbGhzIFRoZSBmbG9hdCBhcnJheSB0aGF0IGhvbGRzIHRoZSBsZWZ0LWhhbmQtc2lkZSBtYXRyaXguCisgICAgICogQHBhcmFtIGxoc09mZnNldCBUaGUgb2Zmc2V0IGludG8gdGhlIGxocyBhcnJheSB3aGVyZSB0aGUgbGhzIGlzIHN0b3JlZAorICAgICAqIEBwYXJhbSByaHMgVGhlIGZsb2F0IGFycmF5IHRoYXQgaG9sZHMgdGhlIHJpZ2h0LWhhbmQtc2lkZSBtYXRyaXguCisgICAgICogQHBhcmFtIHJoc09mZnNldCBUaGUgb2Zmc2V0IGludG8gdGhlIHJocyBhcnJheSB3aGVyZSB0aGUgcmhzIGlzIHN0b3JlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHJlc3VsdCwgbGhzLCBvciByaHMgYXJlIG51bGwsIG9yIGlmCisgICAgICogcmVzdWx0T2Zmc2V0ICsgMTYgPiByZXN1bHQubGVuZ3RoIG9yIGxoc09mZnNldCArIDE2ID4gbGhzLmxlbmd0aCBvcgorICAgICAqIHJoc09mZnNldCArIDE2ID4gcmhzLmxlbmd0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIG11bHRpcGx5TU0oZmxvYXRbXSByZXN1bHQsIGludCByZXN1bHRPZmZzZXQsCisgICAgICAgICAgICBmbG9hdFtdIGxocywgaW50IGxoc09mZnNldCwgZmxvYXRbXSByaHMsIGludCByaHNPZmZzZXQpOworCisgICAgLyoqCisgICAgICogTXVsdGlwbHkgYSA0IGVsZW1lbnQgdmVjdG9yIGJ5IGEgNHg0IG1hdHJpeCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiBhIDQKKyAgICAgKiBlbGVtZW50IGNvbHVtbiB2ZWN0b3IuIEluIG1hdHJpeCBub3RhdGlvbjogcmVzdWx0ID0gbGhzIHggcmhzCisgICAgICoKKyAgICAgKiBUaGUgc2FtZSBmbG9hdCBhcnJheSBtYXkgYmUgcGFzc2VkIGZvciByZXN1bHRWZWMsIGxoc01hdCwgYW5kL29yIHJoc1ZlYy4KKyAgICAgKiBIb3dldmVyLCB0aGUgcmVzdWx0VmVjIGVsZW1lbnQgdmFsdWVzIGFyZSB1bmRlZmluZWQgaWYgdGhlIHJlc3VsdFZlYworICAgICAqIGVsZW1lbnRzIG92ZXJsYXAgZWl0aGVyIHRoZSBsaHNNYXQgb3IgcmhzVmVjIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3VsdFZlYyBUaGUgZmxvYXQgYXJyYXkgdGhhdCBob2xkcyB0aGUgcmVzdWx0IHZlY3Rvci4KKyAgICAgKiBAcGFyYW0gcmVzdWx0VmVjT2Zmc2V0IFRoZSBvZmZzZXQgaW50byB0aGUgcmVzdWx0IGFycmF5IHdoZXJlIHRoZSByZXN1bHQKKyAgICAgKiAgICAgICAgdmVjdG9yIGlzIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gbGhzTWF0IFRoZSBmbG9hdCBhcnJheSB0aGF0IGhvbGRzIHRoZSBsZWZ0LWhhbmQtc2lkZSBtYXRyaXguCisgICAgICogQHBhcmFtIGxoc01hdE9mZnNldCBUaGUgb2Zmc2V0IGludG8gdGhlIGxocyBhcnJheSB3aGVyZSB0aGUgbGhzIGlzIHN0b3JlZAorICAgICAqIEBwYXJhbSByaHNWZWMgVGhlIGZsb2F0IGFycmF5IHRoYXQgaG9sZHMgdGhlIHJpZ2h0LWhhbmQtc2lkZSB2ZWN0b3IuCisgICAgICogQHBhcmFtIHJoc1ZlY09mZnNldCBUaGUgb2Zmc2V0IGludG8gdGhlIHJocyB2ZWN0b3Igd2hlcmUgdGhlIHJocyB2ZWN0b3IKKyAgICAgKiAgICAgICAgaXMgc3RvcmVkLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgcmVzdWx0VmVjLCBsaHNNYXQsCisgICAgICogb3IgcmhzVmVjIGFyZSBudWxsLCBvciBpZiByZXN1bHRWZWNPZmZzZXQgKyA0ID4gcmVzdWx0VmVjLmxlbmd0aAorICAgICAqIG9yIGxoc01hdE9mZnNldCArIDE2ID4gbGhzTWF0Lmxlbmd0aCBvcgorICAgICAqIHJoc1ZlY09mZnNldCArIDQgPiByaHNWZWMubGVuZ3RoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgbXVsdGlwbHlNVihmbG9hdFtdIHJlc3VsdFZlYywKKyAgICAgICAgICAgIGludCByZXN1bHRWZWNPZmZzZXQsIGZsb2F0W10gbGhzTWF0LCBpbnQgbGhzTWF0T2Zmc2V0LAorICAgICAgICAgICAgZmxvYXRbXSByaHNWZWMsIGludCByaHNWZWNPZmZzZXQpOworCisgICAgLyoqCisgICAgICogVHJhbnNwb3NlcyBhIDQgeCA0IG1hdHJpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtVHJhbnMgdGhlIGFycmF5IHRoYXQgaG9sZHMgdGhlIG91dHB1dCBpbnZlcnRlZCBtYXRyaXgKKyAgICAgKiBAcGFyYW0gbVRyYW5zT2Zmc2V0IGFuIG9mZnNldCBpbnRvIG1JbnYgd2hlcmUgdGhlIGludmVydGVkIG1hdHJpeCBpcworICAgICAqICAgICAgICBzdG9yZWQuCisgICAgICogQHBhcmFtIG0gdGhlIGlucHV0IGFycmF5CisgICAgICogQHBhcmFtIG1PZmZzZXQgYW4gb2Zmc2V0IGludG8gbSB3aGVyZSB0aGUgbWF0cml4IGlzIHN0b3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNwb3NlTShmbG9hdFtdIG1UcmFucywgaW50IG1UcmFuc09mZnNldCwgZmxvYXRbXSBtLAorICAgICAgICAgICAgaW50IG1PZmZzZXQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIGludCBtQmFzZSA9IGkgKiA0ICsgbU9mZnNldDsKKyAgICAgICAgICAgIG1UcmFuc1tpICsgbVRyYW5zT2Zmc2V0XSA9IG1bbUJhc2VdOworICAgICAgICAgICAgbVRyYW5zW2kgKyA0ICsgbVRyYW5zT2Zmc2V0XSA9IG1bbUJhc2UgKyAxXTsKKyAgICAgICAgICAgIG1UcmFuc1tpICsgOCArIG1UcmFuc09mZnNldF0gPSBtW21CYXNlICsgMl07CisgICAgICAgICAgICBtVHJhbnNbaSArIDEyICsgbVRyYW5zT2Zmc2V0XSA9IG1bbUJhc2UgKyAzXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludmVydHMgYSA0IHggNCBtYXRyaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gbUludiB0aGUgYXJyYXkgdGhhdCBob2xkcyB0aGUgb3V0cHV0IGludmVydGVkIG1hdHJpeAorICAgICAqIEBwYXJhbSBtSW52T2Zmc2V0IGFuIG9mZnNldCBpbnRvIG1JbnYgd2hlcmUgdGhlIGludmVydGVkIG1hdHJpeCBpcworICAgICAqICAgICAgICBzdG9yZWQuCisgICAgICogQHBhcmFtIG0gdGhlIGlucHV0IGFycmF5CisgICAgICogQHBhcmFtIG1PZmZzZXQgYW4gb2Zmc2V0IGludG8gbSB3aGVyZSB0aGUgbWF0cml4IGlzIHN0b3JlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1hdHJpeCBjb3VsZCBiZSBpbnZlcnRlZCwgZmFsc2UgaWYgaXQgY291bGQgbm90LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbnZlcnRNKGZsb2F0W10gbUludiwgaW50IG1JbnZPZmZzZXQsIGZsb2F0W10gbSwKKyAgICAgICAgICAgIGludCBtT2Zmc2V0KSB7CisgICAgICAgIC8vIEludmVydCBhIDQgeCA0IG1hdHJpeCB1c2luZyBDcmFtZXIncyBSdWxlCisKKyAgICAgICAgLy8gYXJyYXkgb2YgdHJhbnNwb3NlIHNvdXJjZSBtYXRyaXgKKyAgICAgICAgZmxvYXRbXSBzcmMgPSBuZXcgZmxvYXRbMTZdOworCisgICAgICAgIC8vIHRyYW5zcG9zZSBtYXRyaXgKKyAgICAgICAgdHJhbnNwb3NlTShzcmMsIDAsIG0sIG1PZmZzZXQpOworCisgICAgICAgIC8vIHRlbXAgYXJyYXkgZm9yIHBhaXJzCisgICAgICAgIGZsb2F0W10gdG1wID0gbmV3IGZsb2F0WzEyXTsKKworICAgICAgICAvLyBjYWxjdWxhdGUgcGFpcnMgZm9yIGZpcnN0IDggZWxlbWVudHMgKGNvZmFjdG9ycykKKyAgICAgICAgdG1wWzBdID0gc3JjWzEwXSAqIHNyY1sxNV07CisgICAgICAgIHRtcFsxXSA9IHNyY1sxMV0gKiBzcmNbMTRdOworICAgICAgICB0bXBbMl0gPSBzcmNbOV0gKiBzcmNbMTVdOworICAgICAgICB0bXBbM10gPSBzcmNbMTFdICogc3JjWzEzXTsKKyAgICAgICAgdG1wWzRdID0gc3JjWzldICogc3JjWzE0XTsKKyAgICAgICAgdG1wWzVdID0gc3JjWzEwXSAqIHNyY1sxM107CisgICAgICAgIHRtcFs2XSA9IHNyY1s4XSAqIHNyY1sxNV07CisgICAgICAgIHRtcFs3XSA9IHNyY1sxMV0gKiBzcmNbMTJdOworICAgICAgICB0bXBbOF0gPSBzcmNbOF0gKiBzcmNbMTRdOworICAgICAgICB0bXBbOV0gPSBzcmNbMTBdICogc3JjWzEyXTsKKyAgICAgICAgdG1wWzEwXSA9IHNyY1s4XSAqIHNyY1sxM107CisgICAgICAgIHRtcFsxMV0gPSBzcmNbOV0gKiBzcmNbMTJdOworCisgICAgICAgIC8vIEhvbGRzIHRoZSBkZXN0aW5hdGlvbiBtYXRyaXggd2hpbGUgd2UncmUgYnVpbGRpbmcgaXQgdXAuCisgICAgICAgIGZsb2F0W10gZHN0ID0gbmV3IGZsb2F0WzE2XTsKKworICAgICAgICAvLyBjYWxjdWxhdGUgZmlyc3QgOCBlbGVtZW50cyAoY29mYWN0b3JzKQorICAgICAgICBkc3RbMF0gPSB0bXBbMF0gKiBzcmNbNV0gKyB0bXBbM10gKiBzcmNbNl0gKyB0bXBbNF0gKiBzcmNbN107CisgICAgICAgIGRzdFswXSAtPSB0bXBbMV0gKiBzcmNbNV0gKyB0bXBbMl0gKiBzcmNbNl0gKyB0bXBbNV0gKiBzcmNbN107CisgICAgICAgIGRzdFsxXSA9IHRtcFsxXSAqIHNyY1s0XSArIHRtcFs2XSAqIHNyY1s2XSArIHRtcFs5XSAqIHNyY1s3XTsKKyAgICAgICAgZHN0WzFdIC09IHRtcFswXSAqIHNyY1s0XSArIHRtcFs3XSAqIHNyY1s2XSArIHRtcFs4XSAqIHNyY1s3XTsKKyAgICAgICAgZHN0WzJdID0gdG1wWzJdICogc3JjWzRdICsgdG1wWzddICogc3JjWzVdICsgdG1wWzEwXSAqIHNyY1s3XTsKKyAgICAgICAgZHN0WzJdIC09IHRtcFszXSAqIHNyY1s0XSArIHRtcFs2XSAqIHNyY1s1XSArIHRtcFsxMV0gKiBzcmNbN107CisgICAgICAgIGRzdFszXSA9IHRtcFs1XSAqIHNyY1s0XSArIHRtcFs4XSAqIHNyY1s1XSArIHRtcFsxMV0gKiBzcmNbNl07CisgICAgICAgIGRzdFszXSAtPSB0bXBbNF0gKiBzcmNbNF0gKyB0bXBbOV0gKiBzcmNbNV0gKyB0bXBbMTBdICogc3JjWzZdOworICAgICAgICBkc3RbNF0gPSB0bXBbMV0gKiBzcmNbMV0gKyB0bXBbMl0gKiBzcmNbMl0gKyB0bXBbNV0gKiBzcmNbM107CisgICAgICAgIGRzdFs0XSAtPSB0bXBbMF0gKiBzcmNbMV0gKyB0bXBbM10gKiBzcmNbMl0gKyB0bXBbNF0gKiBzcmNbM107CisgICAgICAgIGRzdFs1XSA9IHRtcFswXSAqIHNyY1swXSArIHRtcFs3XSAqIHNyY1syXSArIHRtcFs4XSAqIHNyY1szXTsKKyAgICAgICAgZHN0WzVdIC09IHRtcFsxXSAqIHNyY1swXSArIHRtcFs2XSAqIHNyY1syXSArIHRtcFs5XSAqIHNyY1szXTsKKyAgICAgICAgZHN0WzZdID0gdG1wWzNdICogc3JjWzBdICsgdG1wWzZdICogc3JjWzFdICsgdG1wWzExXSAqIHNyY1szXTsKKyAgICAgICAgZHN0WzZdIC09IHRtcFsyXSAqIHNyY1swXSArIHRtcFs3XSAqIHNyY1sxXSArIHRtcFsxMF0gKiBzcmNbM107CisgICAgICAgIGRzdFs3XSA9IHRtcFs0XSAqIHNyY1swXSArIHRtcFs5XSAqIHNyY1sxXSArIHRtcFsxMF0gKiBzcmNbMl07CisgICAgICAgIGRzdFs3XSAtPSB0bXBbNV0gKiBzcmNbMF0gKyB0bXBbOF0gKiBzcmNbMV0gKyB0bXBbMTFdICogc3JjWzJdOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBwYWlycyBmb3Igc2Vjb25kIDggZWxlbWVudHMgKGNvZmFjdG9ycykKKyAgICAgICAgdG1wWzBdID0gc3JjWzJdICogc3JjWzddOworICAgICAgICB0bXBbMV0gPSBzcmNbM10gKiBzcmNbNl07CisgICAgICAgIHRtcFsyXSA9IHNyY1sxXSAqIHNyY1s3XTsKKyAgICAgICAgdG1wWzNdID0gc3JjWzNdICogc3JjWzVdOworICAgICAgICB0bXBbNF0gPSBzcmNbMV0gKiBzcmNbNl07CisgICAgICAgIHRtcFs1XSA9IHNyY1syXSAqIHNyY1s1XTsKKyAgICAgICAgdG1wWzZdID0gc3JjWzBdICogc3JjWzddOworICAgICAgICB0bXBbN10gPSBzcmNbM10gKiBzcmNbNF07CisgICAgICAgIHRtcFs4XSA9IHNyY1swXSAqIHNyY1s2XTsKKyAgICAgICAgdG1wWzldID0gc3JjWzJdICogc3JjWzRdOworICAgICAgICB0bXBbMTBdID0gc3JjWzBdICogc3JjWzVdOworICAgICAgICB0bXBbMTFdID0gc3JjWzFdICogc3JjWzRdOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBzZWNvbmQgOCBlbGVtZW50cyAoY29mYWN0b3JzKQorICAgICAgICBkc3RbOF0gPSB0bXBbMF0gKiBzcmNbMTNdICsgdG1wWzNdICogc3JjWzE0XSArIHRtcFs0XSAqIHNyY1sxNV07CisgICAgICAgIGRzdFs4XSAtPSB0bXBbMV0gKiBzcmNbMTNdICsgdG1wWzJdICogc3JjWzE0XSArIHRtcFs1XSAqIHNyY1sxNV07CisgICAgICAgIGRzdFs5XSA9IHRtcFsxXSAqIHNyY1sxMl0gKyB0bXBbNl0gKiBzcmNbMTRdICsgdG1wWzldICogc3JjWzE1XTsKKyAgICAgICAgZHN0WzldIC09IHRtcFswXSAqIHNyY1sxMl0gKyB0bXBbN10gKiBzcmNbMTRdICsgdG1wWzhdICogc3JjWzE1XTsKKyAgICAgICAgZHN0WzEwXSA9IHRtcFsyXSAqIHNyY1sxMl0gKyB0bXBbN10gKiBzcmNbMTNdICsgdG1wWzEwXSAqIHNyY1sxNV07CisgICAgICAgIGRzdFsxMF0gLT0gdG1wWzNdICogc3JjWzEyXSArIHRtcFs2XSAqIHNyY1sxM10gKyB0bXBbMTFdICogc3JjWzE1XTsKKyAgICAgICAgZHN0WzExXSA9IHRtcFs1XSAqIHNyY1sxMl0gKyB0bXBbOF0gKiBzcmNbMTNdICsgdG1wWzExXSAqIHNyY1sxNF07CisgICAgICAgIGRzdFsxMV0gLT0gdG1wWzRdICogc3JjWzEyXSArIHRtcFs5XSAqIHNyY1sxM10gKyB0bXBbMTBdICogc3JjWzE0XTsKKyAgICAgICAgZHN0WzEyXSA9IHRtcFsyXSAqIHNyY1sxMF0gKyB0bXBbNV0gKiBzcmNbMTFdICsgdG1wWzFdICogc3JjWzldOworICAgICAgICBkc3RbMTJdIC09IHRtcFs0XSAqIHNyY1sxMV0gKyB0bXBbMF0gKiBzcmNbOV0gKyB0bXBbM10gKiBzcmNbMTBdOworICAgICAgICBkc3RbMTNdID0gdG1wWzhdICogc3JjWzExXSArIHRtcFswXSAqIHNyY1s4XSArIHRtcFs3XSAqIHNyY1sxMF07CisgICAgICAgIGRzdFsxM10gLT0gdG1wWzZdICogc3JjWzEwXSArIHRtcFs5XSAqIHNyY1sxMV0gKyB0bXBbMV0gKiBzcmNbOF07CisgICAgICAgIGRzdFsxNF0gPSB0bXBbNl0gKiBzcmNbOV0gKyB0bXBbMTFdICogc3JjWzExXSArIHRtcFszXSAqIHNyY1s4XTsKKyAgICAgICAgZHN0WzE0XSAtPSB0bXBbMTBdICogc3JjWzExXSArIHRtcFsyXSAqIHNyY1s4XSArIHRtcFs3XSAqIHNyY1s5XTsKKyAgICAgICAgZHN0WzE1XSA9IHRtcFsxMF0gKiBzcmNbMTBdICsgdG1wWzRdICogc3JjWzhdICsgdG1wWzldICogc3JjWzldOworICAgICAgICBkc3RbMTVdIC09IHRtcFs4XSAqIHNyY1s5XSArIHRtcFsxMV0gKiBzcmNbMTBdICsgdG1wWzVdICogc3JjWzhdOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBkZXRlcm1pbmFudAorICAgICAgICBmbG9hdCBkZXQgPQorICAgICAgICAgICAgICAgIHNyY1swXSAqIGRzdFswXSArIHNyY1sxXSAqIGRzdFsxXSArIHNyY1syXSAqIGRzdFsyXSArIHNyY1szXQorICAgICAgICAgICAgICAgICAgICAgICAgKiBkc3RbM107CisKKyAgICAgICAgaWYgKGRldCA9PSAwLjBmKSB7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNhbGN1bGF0ZSBtYXRyaXggaW52ZXJzZQorICAgICAgICBkZXQgPSAxIC8gZGV0OworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgICAgICBtSW52W2ogKyBtSW52T2Zmc2V0XSA9IGRzdFtqXSAqIGRldDsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlcyBhbiBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBtYXRyaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gbSByZXR1cm5zIHRoZSByZXN1bHQKKyAgICAgKiBAcGFyYW0gbU9mZnNldAorICAgICAqIEBwYXJhbSBsZWZ0CisgICAgICogQHBhcmFtIHJpZ2h0CisgICAgICogQHBhcmFtIGJvdHRvbQorICAgICAqIEBwYXJhbSB0b3AKKyAgICAgKiBAcGFyYW0gbmVhcgorICAgICAqIEBwYXJhbSBmYXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgb3J0aG9NKGZsb2F0W10gbSwgaW50IG1PZmZzZXQsCisgICAgICAgIGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGZsb2F0IHRvcCwKKyAgICAgICAgZmxvYXQgbmVhciwgZmxvYXQgZmFyKSB7CisgICAgICAgIGlmIChsZWZ0ID09IHJpZ2h0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsZWZ0ID09IHJpZ2h0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJvdHRvbSA9PSB0b3ApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJvdHRvbSA9PSB0b3AiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmVhciA9PSBmYXIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5lYXIgPT0gZmFyIik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBmbG9hdCByX3dpZHRoICA9IDEuMGYgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICAgICAgZmluYWwgZmxvYXQgcl9oZWlnaHQgPSAxLjBmIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgICAgIGZpbmFsIGZsb2F0IHJfZGVwdGggID0gMS4wZiAvIChmYXIgLSBuZWFyKTsKKyAgICAgICAgZmluYWwgZmxvYXQgeCA9ICAyLjBmICogKHJfd2lkdGgpOworICAgICAgICBmaW5hbCBmbG9hdCB5ID0gIDIuMGYgKiAocl9oZWlnaHQpOworICAgICAgICBmaW5hbCBmbG9hdCB6ID0gLTIuMGYgKiAocl9kZXB0aCk7CisgICAgICAgIGZpbmFsIGZsb2F0IHR4ID0gLShyaWdodCArIGxlZnQpICogcl93aWR0aDsKKyAgICAgICAgZmluYWwgZmxvYXQgdHkgPSAtKHRvcCArIGJvdHRvbSkgKiByX2hlaWdodDsKKyAgICAgICAgZmluYWwgZmxvYXQgdHogPSAtKGZhciArIG5lYXIpICogcl9kZXB0aDsKKyAgICAgICAgbVttT2Zmc2V0ICsgMF0gPSB4OworICAgICAgICBtW21PZmZzZXQgKyA1XSA9IHk7CisgICAgICAgIG1bbU9mZnNldCArMTBdID0gejsKKyAgICAgICAgbVttT2Zmc2V0ICsxMl0gPSB0eDsKKyAgICAgICAgbVttT2Zmc2V0ICsxM10gPSB0eTsKKyAgICAgICAgbVttT2Zmc2V0ICsxNF0gPSB0ejsKKyAgICAgICAgbVttT2Zmc2V0ICsxNV0gPSAxLjBmOworICAgICAgICBtW21PZmZzZXQgKyAxXSA9IDAuMGY7CisgICAgICAgIG1bbU9mZnNldCArIDJdID0gMC4wZjsKKyAgICAgICAgbVttT2Zmc2V0ICsgM10gPSAwLjBmOworICAgICAgICBtW21PZmZzZXQgKyA0XSA9IDAuMGY7CisgICAgICAgIG1bbU9mZnNldCArIDZdID0gMC4wZjsKKyAgICAgICAgbVttT2Zmc2V0ICsgN10gPSAwLjBmOworICAgICAgICBtW21PZmZzZXQgKyA4XSA9IDAuMGY7CisgICAgICAgIG1bbU9mZnNldCArIDldID0gMC4wZjsKKyAgICAgICAgbVttT2Zmc2V0ICsgMTFdID0gMC4wZjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlZmluZSBhIHByb2plY3Rpb24gbWF0cml4IGluIHRlcm1zIG9mIHNpeCBjbGlwIHBsYW5lcworICAgICAqIEBwYXJhbSBtIHRoZSBmbG9hdCBhcnJheSB0aGF0IGhvbGRzIHRoZSBwZXJzcGVjdGl2ZSBtYXRyaXgKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW50byBmbG9hdCBhcnJheSBtIHdoZXJlIHRoZSBwZXJzcGVjdGl2ZQorICAgICAqIG1hdHJpeCBkYXRhIGlzIHdyaXR0ZW4KKyAgICAgKiBAcGFyYW0gbGVmdAorICAgICAqIEBwYXJhbSByaWdodAorICAgICAqIEBwYXJhbSBib3R0b20KKyAgICAgKiBAcGFyYW0gdG9wCisgICAgICogQHBhcmFtIG5lYXIKKyAgICAgKiBAcGFyYW0gZmFyCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZnJ1c3R1bU0oZmxvYXRbXSBtLCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wLAorICAgICAgICAgICAgZmxvYXQgbmVhciwgZmxvYXQgZmFyKSB7CisgICAgICAgIGlmIChsZWZ0ID09IHJpZ2h0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsZWZ0ID09IHJpZ2h0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvcCA9PSBib3R0b20pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRvcCA9PSBib3R0b20iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmVhciA9PSBmYXIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5lYXIgPT0gZmFyIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5lYXIgPD0gMC4wZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmVhciA8PSAwLjBmIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZhciA8PSAwLjBmKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmYXIgPD0gMC4wZiIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGZsb2F0IHJfd2lkdGggID0gMS4wZiAvIChyaWdodCAtIGxlZnQpOworICAgICAgICBmaW5hbCBmbG9hdCByX2hlaWdodCA9IDEuMGYgLyAodG9wIC0gYm90dG9tKTsKKyAgICAgICAgZmluYWwgZmxvYXQgcl9kZXB0aCAgPSAxLjBmIC8gKG5lYXIgLSBmYXIpOworICAgICAgICBmaW5hbCBmbG9hdCB4ID0gMi4wZiAqIChuZWFyICogcl93aWR0aCk7CisgICAgICAgIGZpbmFsIGZsb2F0IHkgPSAyLjBmICogKG5lYXIgKiByX2hlaWdodCk7CisgICAgICAgIGZpbmFsIGZsb2F0IEEgPSAyLjBmICogKChyaWdodCArIGxlZnQpICogcl93aWR0aCk7CisgICAgICAgIGZpbmFsIGZsb2F0IEIgPSAodG9wICsgYm90dG9tKSAqIHJfaGVpZ2h0OworICAgICAgICBmaW5hbCBmbG9hdCBDID0gKGZhciArIG5lYXIpICogcl9kZXB0aDsKKyAgICAgICAgZmluYWwgZmxvYXQgRCA9IDIuMGYgKiAoZmFyICogbmVhciAqIHJfZGVwdGgpOworICAgICAgICBtW29mZnNldCArIDBdID0geDsKKyAgICAgICAgbVtvZmZzZXQgKyA1XSA9IHk7CisgICAgICAgIG1bb2Zmc2V0ICsgOF0gPSBBOworICAgICAgICBtW29mZnNldCArICA5XSA9IEI7CisgICAgICAgIG1bb2Zmc2V0ICsgMTBdID0gQzsKKyAgICAgICAgbVtvZmZzZXQgKyAxNF0gPSBEOworICAgICAgICBtW29mZnNldCArIDExXSA9IC0xLjBmOworICAgICAgICBtW29mZnNldCArICAxXSA9IDAuMGY7CisgICAgICAgIG1bb2Zmc2V0ICsgIDJdID0gMC4wZjsKKyAgICAgICAgbVtvZmZzZXQgKyAgM10gPSAwLjBmOworICAgICAgICBtW29mZnNldCArICA0XSA9IDAuMGY7CisgICAgICAgIG1bb2Zmc2V0ICsgIDZdID0gMC4wZjsKKyAgICAgICAgbVtvZmZzZXQgKyAgN10gPSAwLjBmOworICAgICAgICBtW29mZnNldCArIDEyXSA9IDAuMGY7CisgICAgICAgIG1bb2Zmc2V0ICsgMTNdID0gMC4wZjsKKyAgICAgICAgbVtvZmZzZXQgKyAxNV0gPSAwLjBmOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXB1dGVzIHRoZSBsZW5ndGggb2YgYSB2ZWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSB4IHggY29vcmRpbmF0ZSBvZiBhIHZlY3RvcgorICAgICAqIEBwYXJhbSB5IHkgY29vcmRpbmF0ZSBvZiBhIHZlY3RvcgorICAgICAqIEBwYXJhbSB6IHogY29vcmRpbmF0ZSBvZiBhIHZlY3RvcgorICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiBhIHZlY3RvcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgbGVuZ3RoKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgcmV0dXJuIChmbG9hdCkgTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBtYXRyaXggbSB0byB0aGUgaWRlbnRpdHkgbWF0cml4LgorICAgICAqIEBwYXJhbSBzbSByZXR1cm5zIHRoZSByZXN1bHQKKyAgICAgKiBAcGFyYW0gc21PZmZzZXQgaW5kZXggaW50byBzbSB3aGVyZSB0aGUgcmVzdWx0IG1hdHJpeCBzdGFydHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SWRlbnRpdHlNKGZsb2F0W10gc20sIGludCBzbU9mZnNldCkgeworICAgICAgICBmb3IgKGludCBpPTAgOyBpPDE2IDsgaSsrKSB7CisgICAgICAgICAgICBzbVtzbU9mZnNldCArIGldID0gMDsKKyAgICAgICAgfQorICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkgKz0gNSkgeworICAgICAgICAgICAgc21bc21PZmZzZXQgKyBpXSA9IDEuMGY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2FsZXMgbWF0cml4ICBtIGJ5IHgsIHksIGFuZCB6LCBwdXR0aW5nIHRoZSByZXN1bHQgaW4gc20KKyAgICAgKiBAcGFyYW0gc20gcmV0dXJucyB0aGUgcmVzdWx0CisgICAgICogQHBhcmFtIHNtT2Zmc2V0IGluZGV4IGludG8gc20gd2hlcmUgdGhlIHJlc3VsdCBtYXRyaXggc3RhcnRzCisgICAgICogQHBhcmFtIG0gc291cmNlIG1hdHJpeAorICAgICAqIEBwYXJhbSBtT2Zmc2V0IGluZGV4IGludG8gbSB3aGVyZSB0aGUgc291cmNlIG1hdHJpeCBzdGFydHMKKyAgICAgKiBAcGFyYW0geCBzY2FsZSBmYWN0b3IgeAorICAgICAqIEBwYXJhbSB5IHNjYWxlIGZhY3RvciB5CisgICAgICogQHBhcmFtIHogc2NhbGUgZmFjdG9yIHoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2NhbGVNKGZsb2F0W10gc20sIGludCBzbU9mZnNldCwKKyAgICAgICAgICAgIGZsb2F0W10gbSwgaW50IG1PZmZzZXQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgICAgaW50IHNtaSA9IHNtT2Zmc2V0ICsgaTsKKyAgICAgICAgICAgIGludCBtaSA9IG1PZmZzZXQgKyBpOworICAgICAgICAgICAgc21bICAgICBzbWldID0gbVsgICAgIG1pXSAqIHg7CisgICAgICAgICAgICBzbVsgNCArIHNtaV0gPSBtWyA0ICsgbWldICogeTsKKyAgICAgICAgICAgIHNtWyA4ICsgc21pXSA9IG1bIDggKyBtaV0gKiB6OworICAgICAgICAgICAgc21bMTIgKyBzbWldID0gbVsxMiArIG1pXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNjYWxlcyBtYXRyaXggbSBpbiBwbGFjZSBieSBzeCwgc3ksIGFuZCBzegorICAgICAqIEBwYXJhbSBtIG1hdHJpeCB0byBzY2FsZQorICAgICAqIEBwYXJhbSBtT2Zmc2V0IGluZGV4IGludG8gbSB3aGVyZSB0aGUgbWF0cml4IHN0YXJ0cworICAgICAqIEBwYXJhbSB4IHNjYWxlIGZhY3RvciB4CisgICAgICogQHBhcmFtIHkgc2NhbGUgZmFjdG9yIHkKKyAgICAgKiBAcGFyYW0geiBzY2FsZSBmYWN0b3IgegorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzY2FsZU0oZmxvYXRbXSBtLCBpbnQgbU9mZnNldCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgZm9yIChpbnQgaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgbWkgPSBtT2Zmc2V0ICsgaTsKKyAgICAgICAgICAgIG1bICAgICBtaV0gKj0geDsKKyAgICAgICAgICAgIG1bIDQgKyBtaV0gKj0geTsKKyAgICAgICAgICAgIG1bIDggKyBtaV0gKj0gejsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zbGF0ZXMgbWF0cml4IG0gYnkgeCwgeSwgYW5kIHosIHB1dHRpbmcgdGhlIHJlc3VsdCBpbiB0bQorICAgICAqIEBwYXJhbSB0bSByZXR1cm5zIHRoZSByZXN1bHQKKyAgICAgKiBAcGFyYW0gdG1PZmZzZXQgaW5kZXggaW50byBzbSB3aGVyZSB0aGUgcmVzdWx0IG1hdHJpeCBzdGFydHMKKyAgICAgKiBAcGFyYW0gbSBzb3VyY2UgbWF0cml4CisgICAgICogQHBhcmFtIG1PZmZzZXQgaW5kZXggaW50byBtIHdoZXJlIHRoZSBzb3VyY2UgbWF0cml4IHN0YXJ0cworICAgICAqIEBwYXJhbSB4IHRyYW5zbGF0aW9uIGZhY3RvciB4CisgICAgICogQHBhcmFtIHkgdHJhbnNsYXRpb24gZmFjdG9yIHkKKyAgICAgKiBAcGFyYW0geiB0cmFuc2xhdGlvbiBmYWN0b3IgegorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2xhdGVNKGZsb2F0W10gdG0sIGludCB0bU9mZnNldCwKKyAgICAgICAgICAgIGZsb2F0W10gbSwgaW50IG1PZmZzZXQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8MTIgOyBpKyspIHsKKyAgICAgICAgICAgIHRtW3RtT2Zmc2V0ICsgaV0gPSBtW21PZmZzZXQgKyBpXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgICAgIGludCB0bWkgPSB0bU9mZnNldCArIGk7CisgICAgICAgICAgICBpbnQgbWkgPSBtT2Zmc2V0ICsgaTsKKyAgICAgICAgICAgIHRtWzEyICsgdG1pXSA9IG1bbWldICogeCArIG1bNCArIG1pXSAqIHkgKyBtWzggKyBtaV0gKiB6ICsKKyAgICAgICAgICAgICAgICBtWzEyICsgbWldOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlcyBtYXRyaXggbSBieSB4LCB5LCBhbmQgeiBpbiBwbGFjZS4KKyAgICAgKiBAcGFyYW0gbSBtYXRyaXgKKyAgICAgKiBAcGFyYW0gbU9mZnNldCBpbmRleCBpbnRvIG0gd2hlcmUgdGhlIG1hdHJpeCBzdGFydHMKKyAgICAgKiBAcGFyYW0geCB0cmFuc2xhdGlvbiBmYWN0b3IgeAorICAgICAqIEBwYXJhbSB5IHRyYW5zbGF0aW9uIGZhY3RvciB5CisgICAgICogQHBhcmFtIHogdHJhbnNsYXRpb24gZmFjdG9yIHoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNsYXRlTSgKKyAgICAgICAgICAgIGZsb2F0W10gbSwgaW50IG1PZmZzZXQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgICAgaW50IG1pID0gbU9mZnNldCArIGk7CisgICAgICAgICAgICBtWzEyICsgbWldICs9IG1bbWldICogeCArIG1bNCArIG1pXSAqIHkgKyBtWzggKyBtaV0gKiB6OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUm90YXRlcyBtYXRyaXggbSBieSBhbmdsZSBhIChpbiBkZWdyZWVzKSBhcm91bmQgdGhlIGF4aXMgKHgsIHksIHopCisgICAgICogQHBhcmFtIHJtIHJldHVybnMgdGhlIHJlc3VsdAorICAgICAqIEBwYXJhbSBybU9mZnNldCBpbmRleCBpbnRvIHJtIHdoZXJlIHRoZSByZXN1bHQgbWF0cml4IHN0YXJ0cworICAgICAqIEBwYXJhbSBtIHNvdXJjZSBtYXRyaXgKKyAgICAgKiBAcGFyYW0gbU9mZnNldCBpbmRleCBpbnRvIG0gd2hlcmUgdGhlIHNvdXJjZSBtYXRyaXggc3RhcnRzCisgICAgICogQHBhcmFtIGEgYW5nbGUgdG8gcm90YXRlIGluIGRlZ3JlZXMKKyAgICAgKiBAcGFyYW0geCBzY2FsZSBmYWN0b3IgeAorICAgICAqIEBwYXJhbSB5IHNjYWxlIGZhY3RvciB5CisgICAgICogQHBhcmFtIHogc2NhbGUgZmFjdG9yIHoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcm90YXRlTShmbG9hdFtdIHJtLCBpbnQgcm1PZmZzZXQsCisgICAgICAgICAgICBmbG9hdFtdIG0sIGludCBtT2Zmc2V0LAorICAgICAgICAgICAgZmxvYXQgYSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICBmbG9hdFtdIHIgPSBuZXcgZmxvYXRbMTZdOworICAgICAgICBzZXRSb3RhdGVNKHIsIDAsIGEsIHgsIHksIHopOworICAgICAgICBtdWx0aXBseU1NKHJtLCBybU9mZnNldCwgbSwgbU9mZnNldCwgciwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUm90YXRlcyBtYXRyaXggbSBpbiBwbGFjZSBieSBhbmdsZSBhIChpbiBkZWdyZWVzKQorICAgICAqIGFyb3VuZCB0aGUgYXhpcyAoeCwgeSwgeikKKyAgICAgKiBAcGFyYW0gbSBzb3VyY2UgbWF0cml4CisgICAgICogQHBhcmFtIG1PZmZzZXQgaW5kZXggaW50byBtIHdoZXJlIHRoZSBtYXRyaXggc3RhcnRzCisgICAgICogQHBhcmFtIGEgYW5nbGUgdG8gcm90YXRlIGluIGRlZ3JlZXMKKyAgICAgKiBAcGFyYW0geCBzY2FsZSBmYWN0b3IgeAorICAgICAqIEBwYXJhbSB5IHNjYWxlIGZhY3RvciB5CisgICAgICogQHBhcmFtIHogc2NhbGUgZmFjdG9yIHoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcm90YXRlTShmbG9hdFtdIG0sIGludCBtT2Zmc2V0LAorICAgICAgICAgICAgZmxvYXQgYSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICBmbG9hdFtdIHRlbXAgPSBuZXcgZmxvYXRbMzJdOworICAgICAgICBzZXRSb3RhdGVNKHRlbXAsIDAsIGEsIHgsIHksIHopOworICAgICAgICBtdWx0aXBseU1NKHRlbXAsIDE2LCBtLCBtT2Zmc2V0LCB0ZW1wLCAwKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAxNiwgbSwgbU9mZnNldCwgMTYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJvdGF0ZXMgbWF0cml4IG0gYnkgYW5nbGUgYSAoaW4gZGVncmVlcykgYXJvdW5kIHRoZSBheGlzICh4LCB5LCB6KQorICAgICAqIEBwYXJhbSBybSByZXR1cm5zIHRoZSByZXN1bHQKKyAgICAgKiBAcGFyYW0gcm1PZmZzZXQgaW5kZXggaW50byBybSB3aGVyZSB0aGUgcmVzdWx0IG1hdHJpeCBzdGFydHMKKyAgICAgKiBAcGFyYW0gYSBhbmdsZSB0byByb3RhdGUgaW4gZGVncmVlcworICAgICAqIEBwYXJhbSB4IHNjYWxlIGZhY3RvciB4CisgICAgICogQHBhcmFtIHkgc2NhbGUgZmFjdG9yIHkKKyAgICAgKiBAcGFyYW0geiBzY2FsZSBmYWN0b3IgegorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSb3RhdGVNKGZsb2F0W10gcm0sIGludCBybU9mZnNldCwKKyAgICAgICAgICAgIGZsb2F0IGEsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgcm1bcm1PZmZzZXQgKyAzXSA9IDA7CisgICAgICAgIHJtW3JtT2Zmc2V0ICsgN10gPSAwOworICAgICAgICBybVtybU9mZnNldCArIDExXT0gMDsKKyAgICAgICAgcm1bcm1PZmZzZXQgKyAxMl09IDA7CisgICAgICAgIHJtW3JtT2Zmc2V0ICsgMTNdPSAwOworICAgICAgICBybVtybU9mZnNldCArIDE0XT0gMDsKKyAgICAgICAgcm1bcm1PZmZzZXQgKyAxNV09IDE7CisgICAgICAgIGEgKj0gKGZsb2F0KSAoTWF0aC5QSSAvIDE4MC4wZik7CisgICAgICAgIGZsb2F0IHMgPSAoZmxvYXQpIE1hdGguc2luKGEpOworICAgICAgICBmbG9hdCBjID0gKGZsb2F0KSBNYXRoLmNvcyhhKTsKKyAgICAgICAgaWYgKDEuMGYgPT0geCAmJiAwLjBmID09IHkgJiYgMC4wZiA9PSB6KSB7CisgICAgICAgICAgICBybVtybU9mZnNldCArIDVdID0gYzsgICBybVtybU9mZnNldCArIDEwXT0gYzsKKyAgICAgICAgICAgIHJtW3JtT2Zmc2V0ICsgNl0gPSBzOyAgIHJtW3JtT2Zmc2V0ICsgOV0gPSAtczsKKyAgICAgICAgICAgIHJtW3JtT2Zmc2V0ICsgMV0gPSAwOyAgIHJtW3JtT2Zmc2V0ICsgMl0gPSAwOworICAgICAgICAgICAgcm1bcm1PZmZzZXQgKyA0XSA9IDA7ICAgcm1bcm1PZmZzZXQgKyA4XSA9IDA7CisgICAgICAgICAgICBybVtybU9mZnNldCArIDBdID0gMTsKKyAgICAgICAgfSBlbHNlIGlmICgwLjBmID09IHggJiYgMS4wZiA9PSB5ICYmIDAuMGYgPT0geikgeworICAgICAgICAgICAgcm1bcm1PZmZzZXQgKyAwXSA9IGM7ICAgcm1bcm1PZmZzZXQgKyAxMF09IGM7CisgICAgICAgICAgICBybVtybU9mZnNldCArIDhdID0gczsgICBybVtybU9mZnNldCArIDJdID0gLXM7CisgICAgICAgICAgICBybVtybU9mZnNldCArIDFdID0gMDsgICBybVtybU9mZnNldCArIDRdID0gMDsKKyAgICAgICAgICAgIHJtW3JtT2Zmc2V0ICsgNl0gPSAwOyAgIHJtW3JtT2Zmc2V0ICsgOV0gPSAwOworICAgICAgICAgICAgcm1bcm1PZmZzZXQgKyA1XSA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoMC4wZiA9PSB4ICYmIDAuMGYgPT0geSAmJiAxLjBmID09IHopIHsKKyAgICAgICAgICAgIHJtW3JtT2Zmc2V0ICsgMF0gPSBjOyAgIHJtW3JtT2Zmc2V0ICsgNV0gPSBjOworICAgICAgICAgICAgcm1bcm1PZmZzZXQgKyAxXSA9IHM7ICAgcm1bcm1PZmZzZXQgKyA0XSA9IC1zOworICAgICAgICAgICAgcm1bcm1PZmZzZXQgKyAyXSA9IDA7ICAgcm1bcm1PZmZzZXQgKyA2XSA9IDA7CisgICAgICAgICAgICBybVtybU9mZnNldCArIDhdID0gMDsgICBybVtybU9mZnNldCArIDldID0gMDsKKyAgICAgICAgICAgIHJtW3JtT2Zmc2V0ICsgMTBdPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxvYXQgbGVuID0gbGVuZ3RoKHgsIHksIHopOworICAgICAgICAgICAgaWYgKDEuMGYgIT0gbGVuKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgcmVjaXBMZW4gPSAxLjBmIC8gbGVuOworICAgICAgICAgICAgICAgIHggKj0gcmVjaXBMZW47CisgICAgICAgICAgICAgICAgeSAqPSByZWNpcExlbjsKKyAgICAgICAgICAgICAgICB6ICo9IHJlY2lwTGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmxvYXQgbmMgPSAxLjBmIC0gYzsKKyAgICAgICAgICAgIGZsb2F0IHh5ID0geCAqIHk7CisgICAgICAgICAgICBmbG9hdCB5eiA9IHkgKiB6OworICAgICAgICAgICAgZmxvYXQgenggPSB6ICogeDsKKyAgICAgICAgICAgIGZsb2F0IHhzID0geCAqIHM7CisgICAgICAgICAgICBmbG9hdCB5cyA9IHkgKiBzOworICAgICAgICAgICAgZmxvYXQgenMgPSB6ICogczsKKyAgICAgICAgICAgIHJtW3JtT2Zmc2V0ICsgIDBdID0geCp4Km5jICsgIGM7CisgICAgICAgICAgICBybVtybU9mZnNldCArICA0XSA9ICB4eSpuYyAtIHpzOworICAgICAgICAgICAgcm1bcm1PZmZzZXQgKyAgOF0gPSAgengqbmMgKyB5czsKKyAgICAgICAgICAgIHJtW3JtT2Zmc2V0ICsgIDFdID0gIHh5Km5jICsgenM7CisgICAgICAgICAgICBybVtybU9mZnNldCArICA1XSA9IHkqeSpuYyArICBjOworICAgICAgICAgICAgcm1bcm1PZmZzZXQgKyAgOV0gPSAgeXoqbmMgLSB4czsKKyAgICAgICAgICAgIHJtW3JtT2Zmc2V0ICsgIDJdID0gIHp4Km5jIC0geXM7CisgICAgICAgICAgICBybVtybU9mZnNldCArICA2XSA9ICB5eipuYyArIHhzOworICAgICAgICAgICAgcm1bcm1PZmZzZXQgKyAxMF0gPSB6KnoqbmMgKyAgYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIEV1bGVyIGFuZ2xlcyB0byBhIHJvdGF0aW9uIG1hdHJpeAorICAgICAqIEBwYXJhbSBybSByZXR1cm5zIHRoZSByZXN1bHQKKyAgICAgKiBAcGFyYW0gcm1PZmZzZXQgaW5kZXggaW50byBybSB3aGVyZSB0aGUgcmVzdWx0IG1hdHJpeCBzdGFydHMKKyAgICAgKiBAcGFyYW0geCBhbmdsZSBvZiByb3RhdGlvbiwgaW4gZGVncmVlcworICAgICAqIEBwYXJhbSB5IGFuZ2xlIG9mIHJvdGF0aW9uLCBpbiBkZWdyZWVzCisgICAgICogQHBhcmFtIHogYW5nbGUgb2Ygcm90YXRpb24sIGluIGRlZ3JlZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Um90YXRlRXVsZXJNKGZsb2F0W10gcm0sIGludCBybU9mZnNldCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgeCAqPSAoZmxvYXQpIChNYXRoLlBJIC8gMTgwLjBmKTsKKyAgICAgICAgeSAqPSAoZmxvYXQpIChNYXRoLlBJIC8gMTgwLjBmKTsKKyAgICAgICAgeiAqPSAoZmxvYXQpIChNYXRoLlBJIC8gMTgwLjBmKTsKKyAgICAgICAgZmxvYXQgY3ggPSAoZmxvYXQpIE1hdGguY29zKHgpOworICAgICAgICBmbG9hdCBzeCA9IChmbG9hdCkgTWF0aC5zaW4oeCk7CisgICAgICAgIGZsb2F0IGN5ID0gKGZsb2F0KSBNYXRoLmNvcyh5KTsKKyAgICAgICAgZmxvYXQgc3kgPSAoZmxvYXQpIE1hdGguc2luKHkpOworICAgICAgICBmbG9hdCBjeiA9IChmbG9hdCkgTWF0aC5jb3Moeik7CisgICAgICAgIGZsb2F0IHN6ID0gKGZsb2F0KSBNYXRoLnNpbih6KTsKKyAgICAgICAgZmxvYXQgY3hzeSA9IGN4ICogc3k7CisgICAgICAgIGZsb2F0IHN4c3kgPSBzeCAqIHN5OworCisgICAgICAgIHJtW3JtT2Zmc2V0ICsgMF0gID0gICBjeSAqIGN6OworICAgICAgICBybVtybU9mZnNldCArIDFdICA9ICAtY3kgKiBzejsKKyAgICAgICAgcm1bcm1PZmZzZXQgKyAyXSAgPSAgIHN5OworICAgICAgICBybVtybU9mZnNldCArIDNdICA9ICAwLjBmOworCisgICAgICAgIHJtW3JtT2Zmc2V0ICsgNF0gID0gIGN4c3kgKiBjeiArIGN4ICogc3o7CisgICAgICAgIHJtW3JtT2Zmc2V0ICsgNV0gID0gLWN4c3kgKiBzeiArIGN4ICogY3o7CisgICAgICAgIHJtW3JtT2Zmc2V0ICsgNl0gID0gIC1zeCAqIGN5OworICAgICAgICBybVtybU9mZnNldCArIDddICA9ICAwLjBmOworCisgICAgICAgIHJtW3JtT2Zmc2V0ICsgOF0gID0gLXN4c3kgKiBjeiArIHN4ICogc3o7CisgICAgICAgIHJtW3JtT2Zmc2V0ICsgOV0gID0gIHN4c3kgKiBzeiArIHN4ICogY3o7CisgICAgICAgIHJtW3JtT2Zmc2V0ICsgMTBdID0gIGN4ICogY3k7CisgICAgICAgIHJtW3JtT2Zmc2V0ICsgMTFdID0gIDAuMGY7CisKKyAgICAgICAgcm1bcm1PZmZzZXQgKyAxMl0gPSAgMC4wZjsKKyAgICAgICAgcm1bcm1PZmZzZXQgKyAxM10gPSAgMC4wZjsKKyAgICAgICAgcm1bcm1PZmZzZXQgKyAxNF0gPSAgMC4wZjsKKyAgICAgICAgcm1bcm1PZmZzZXQgKyAxNV0gPSAgMS4wZjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9PYmplY3QzRC5qYXZhIGIvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvT2JqZWN0M0QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDBjNmE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvT2JqZWN0M0QuamF2YQpAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5vcGVuZ2w7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLkludEJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLio7CisKKy8qKgorICoge0BoaWRlfQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgT2JqZWN0M0QgeworCisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNUZXhjb29yZHMgPSBmYWxzZTsKKworICAgIHByaXZhdGUgZmxvYXQgbUJvdW5kc01pblggPSBGbG9hdC5NQVhfVkFMVUU7CisgICAgcHJpdmF0ZSBmbG9hdCBtQm91bmRzTWF4WCA9IEZsb2F0Lk1JTl9WQUxVRTsKKyAgICBwcml2YXRlIGZsb2F0IG1Cb3VuZHNNaW5ZID0gRmxvYXQuTUFYX1ZBTFVFOworICAgIHByaXZhdGUgZmxvYXQgbUJvdW5kc01heFkgPSBGbG9hdC5NSU5fVkFMVUU7CisgICAgcHJpdmF0ZSBmbG9hdCBtQm91bmRzTWluWiA9IEZsb2F0Lk1BWF9WQUxVRTsKKyAgICBwcml2YXRlIGZsb2F0IG1Cb3VuZHNNYXhaID0gRmxvYXQuTUlOX1ZBTFVFOworCisgICAgcHJpdmF0ZSBJbnRCdWZmZXIgbVZlcnRleEJ1ZmZlcjsKKyAgICBwcml2YXRlIEludEJ1ZmZlciBtTm9ybWFsQnVmZmVyOworICAgIHByaXZhdGUgSW50QnVmZmVyIG1UZXhjb29yZEJ1ZmZlcjsKKworICAgIC8vIEFsbCBncm91cHMsIGJ5IG5hbWUKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEdyb3VwPiBtR3JvdXBzOworCisgICAgLy8gQWxsIG1hdGVyaWFscywgYnkgbmFtZQorICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWF0ZXJpYWw+IG1NYXRlcmlhbHM7CisKKyAgICAvLyBBbGwgdGV4dHVyZSBtYXBzLCBieSBuYW1lCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBUZXh0dXJlPiBtVGV4dHVyZXM7CisKKyAgICBwdWJsaWMgT2JqZWN0M0QoKSB7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2Qgd2l0aCBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGNvbnRydWN0cworICAgICAqIGFuZCBJbnB1dFN0cmVhbSBmcm9tIHRoZSBnaXZlbiBmaWxlbmFtZS4gIEZvciBleGFtcGxlLCBpZiB0aGUKKyAgICAgKiBzb3VyY2UgZmlsZXMgYXJlIHRvIGJlIHJldHJpZXZlZCB1c2luZyBhbiBBc3NldE1hbmFnZXIsCisgICAgICogdGhlIGltcGxlbWVudGF0aW9uIHdvdWxkIHVzZSBBc3NldE1hbmFnZXIubG9hZCgpIHRvCisgICAgICogZ2V0IHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IElucHV0U3RyZWFtIHJlYWRGaWxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0KCkgeworICAgICAgICBtVmVydGV4QnVmZmVyID0gbU5vcm1hbEJ1ZmZlciA9IG1UZXhjb29yZEJ1ZmZlciA9IG51bGw7CisKKyAgICAgICAgbUdyb3VwcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxHcm91cD4oKTsKKyAgICAgICAgbU1hdGVyaWFscyA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXRlcmlhbD4oKTsKKyAgICAgICAgbVRleHR1cmVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFRleHR1cmU+KCk7CisgICAgfQorCisgICAgcHVibGljIE1hdGVyaWFsIGdldE1hdGVyaWFsKFN0cmluZyBuYW1lKSB7CisgICAgICAgIE1hdGVyaWFsIG1hdCA9IG1NYXRlcmlhbHMuZ2V0KG5hbWUpOworICAgICAgICByZXR1cm4gbWF0OworICAgIH0KKworICAgIHB1YmxpYyBUZXh0dXJlIGdldFRleHR1cmUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG1UZXh0dXJlcy5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIEludEJ1ZmZlciBnZXRWZXJ0ZXhCdWZmZXIoKSB7CisgICAgICAgIHJldHVybiBtVmVydGV4QnVmZmVyOworICAgIH0KKworICAgIHB1YmxpYyBJbnRCdWZmZXIgZ2V0Tm9ybWFsQnVmZmVyKCkgeworICAgICAgICByZXR1cm4gbU5vcm1hbEJ1ZmZlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50QnVmZmVyIGdldFRleGNvb3JkQnVmZmVyKCkgeworICAgICAgICByZXR1cm4gbVRleGNvb3JkQnVmZmVyOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TnVtVHJpYW5nbGVzKCkgeworICAgICAgICBpbnQgbnVtVHJpYW5nbGVzID0gMDsKKyAgICAgICAgSXRlcmF0b3I8R3JvdXA+IGl0ZXIgPSBtR3JvdXBzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgbnVtVHJpYW5nbGVzICs9IGl0ZXIubmV4dCgpLmdldE51bVRyaWFuZ2xlcygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudW1UcmlhbmdsZXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzVGV4Y29vcmRzKCkgeworICAgICAgICByZXR1cm4gbUhhc1RleGNvb3JkczsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0Qm91bmRzTWluWCgpIHsKKyAgICAgICAgcmV0dXJuIG1Cb3VuZHNNaW5YOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRCb3VuZHNNYXhYKCkgeworICAgICAgICByZXR1cm4gbUJvdW5kc01heFg7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldEJvdW5kc01pblkoKSB7CisgICAgICAgIHJldHVybiBtQm91bmRzTWluWTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0Qm91bmRzTWF4WSgpIHsKKyAgICAgICAgcmV0dXJuIG1Cb3VuZHNNYXhZOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRCb3VuZHNNaW5aKCkgeworICAgICAgICByZXR1cm4gbUJvdW5kc01pblo7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldEJvdW5kc01heFooKSB7CisgICAgICAgIHJldHVybiBtQm91bmRzTWF4WjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkVGV4dHVyZShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSByZWFkRmlsZShuYW1lICsgIi5yYXciKTsKKyAgICAgICAgVGV4dHVyZSB0ZXh0dXJlID0gbmV3IFRleHR1cmUoaXMpOworICAgICAgICBtVGV4dHVyZXMucHV0KG5hbWUsIHRleHR1cmUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5Qnl0ZShEYXRhSW5wdXRTdHJlYW0gZGlzLCBpbnQgYikgCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHggPSBkaXMucmVhZCgpICYgMHhmZjsKKyAgICAgICAgaWYgKHggIT0gYikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkJhZCBieXRlOiAiICsKKyAgICAgICAgICAgICAgICAgICAgeCArCisgICAgICAgICAgICAgICAgICAgICIgKGV4cGVjdGVkICIgKyBiICsgIikiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWQoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXNldCgpOworCisgICAgICAgIERhdGFJbnB1dFN0cmVhbSBkaXMgPSBuZXcgRGF0YUlucHV0U3RyZWFtKHJlYWRGaWxlKGZpbGVuYW1lKSk7CisgICAgICAgIHZlcmlmeUJ5dGUoZGlzLCAnZycgKyAxMjgpOworICAgICAgICB2ZXJpZnlCeXRlKGRpcywgJ2wnKTsKKyAgICAgICAgdmVyaWZ5Qnl0ZShkaXMsICdlJyk7CisgICAgICAgIHZlcmlmeUJ5dGUoZGlzLCAncycpOworCisgICAgICAgIGludCBudW1UdXBsZXMgPSBkaXMucmVhZEludCgpOworCisgICAgICAgIHRoaXMubUJvdW5kc01pblggPSBkaXMucmVhZEZsb2F0KCk7CisgICAgICAgIHRoaXMubUJvdW5kc01heFggPSBkaXMucmVhZEZsb2F0KCk7CisgICAgICAgIHRoaXMubUJvdW5kc01pblkgPSBkaXMucmVhZEZsb2F0KCk7CisgICAgICAgIHRoaXMubUJvdW5kc01heFkgPSBkaXMucmVhZEZsb2F0KCk7CisgICAgICAgIHRoaXMubUJvdW5kc01pblogPSBkaXMucmVhZEZsb2F0KCk7CisgICAgICAgIHRoaXMubUJvdW5kc01heFogPSBkaXMucmVhZEZsb2F0KCk7CisKKyAgICAgICAgdGhpcy5tSGFzVGV4Y29vcmRzID0gZGlzLnJlYWRJbnQoKSA9PSAxOworCisgICAgICAgIGludCBpbnRzUGVyVHVwbGUgPSBtSGFzVGV4Y29vcmRzID8gOCA6IDY7CisgICAgICAgIGludCBudW1JbnRzID0gbnVtVHVwbGVzKmludHNQZXJUdXBsZTsKKworICAgICAgICBpbnQgbGVuID0gNCpudW1UdXBsZXMqKG1IYXNUZXhjb29yZHMgPyA4IDogNik7CisKKyAgICAgICAgYnl0ZVtdIHRtcCA9IG5ldyBieXRlW2xlbl07CisgICAgICAgIGludCB0aWR4ID0gMDsKKyAgICAgICAgd2hpbGUgKHRpZHggPCBsZW4pIHsKKyAgICAgICAgICAgIHRpZHggKz0gZGlzLnJlYWQodG1wLCB0aWR4LCBsZW4gLSB0aWR4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkgPT0gQnl0ZU9yZGVyLkJJR19FTkRJQU4pIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHsKKyAgICAgICAgICAgICAgICBieXRlIHRtcDAgPSB0bXBbaV07CisgICAgICAgICAgICAgICAgYnl0ZSB0bXAxID0gdG1wW2kgKyAxXTsKKyAgICAgICAgICAgICAgICBieXRlIHRtcDIgPSB0bXBbaSArIDJdOworICAgICAgICAgICAgICAgIGJ5dGUgdG1wMyA9IHRtcFtpICsgM107CisgICAgICAgICAgICAgICAgdG1wW2ldID0gdG1wMzsKKyAgICAgICAgICAgICAgICB0bXBbaSArIDFdID0gdG1wMjsKKyAgICAgICAgICAgICAgICB0bXBbaSArIDJdID0gdG1wMTsKKyAgICAgICAgICAgICAgICB0bXBbaSArIDNdID0gdG1wMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEJ5dGVCdWZmZXIgYWxsYmIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KGxlbik7CisgICAgICAgIGFsbGJiLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKKyAgICAgICAgYWxsYmIucHV0KHRtcCk7CisKKyAgICAgICAgYWxsYmIucG9zaXRpb24oMCk7CisgICAgICAgIGFsbGJiLmxpbWl0KDQqMypudW1UdXBsZXMpOworICAgICAgICBCeXRlQnVmZmVyIHZiYiA9IGFsbGJiLnNsaWNlKCk7CisgICAgICAgIHRoaXMubVZlcnRleEJ1ZmZlciA9IHZiYi5hc0ludEJ1ZmZlcigpOworICAgICAgICBtVmVydGV4QnVmZmVyLnBvc2l0aW9uKDApOworCisgICAgICAgIGlmIChtSGFzVGV4Y29vcmRzKSB7CisgICAgICAgICAgICBhbGxiYi5wb3NpdGlvbihhbGxiYi5saW1pdCgpKTsKKyAgICAgICAgICAgIGFsbGJiLmxpbWl0KGFsbGJiLnBvc2l0aW9uKCkgKyA0KjIqbnVtVHVwbGVzKTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgdGJiID0gYWxsYmIuc2xpY2UoKTsKKyAgICAgICAgICAgIHRoaXMubVRleGNvb3JkQnVmZmVyID0gdGJiLmFzSW50QnVmZmVyKCk7CisgICAgICAgICAgICBtVGV4Y29vcmRCdWZmZXIucG9zaXRpb24oMCk7CisgICAgICAgIH0KKworICAgICAgICBhbGxiYi5wb3NpdGlvbihhbGxiYi5saW1pdCgpKTsKKyAgICAgICAgYWxsYmIubGltaXQoYWxsYmIucG9zaXRpb24oKSArIDQqMypudW1UdXBsZXMpOworICAgICAgICBCeXRlQnVmZmVyIG5iYiA9IGFsbGJiLnNsaWNlKCk7CisgICAgICAgIHRoaXMubU5vcm1hbEJ1ZmZlciA9IG5iYi5hc0ludEJ1ZmZlcigpOworICAgICAgICBtTm9ybWFsQnVmZmVyLnBvc2l0aW9uKDApOworCisgICAgICAgIGludCBudW1NYXRlcmlhbHMgPSBkaXMucmVhZEludCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bU1hdGVyaWFsczsgaSsrKSB7CisgICAgICAgICAgICBNYXRlcmlhbCBtYXQgPSBuZXcgTWF0ZXJpYWwodGhpcyk7CisgICAgICAgICAgICBtYXQubG9hZChkaXMpOworICAgICAgICAgICAgbU1hdGVyaWFscy5wdXQobWF0LmdldE5hbWUoKSwgbWF0KTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBudW1Hcm91cHMgPSBkaXMucmVhZEludCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUdyb3VwczsgaSsrKSB7CisgICAgICAgICAgICBHcm91cCBnID0gbmV3IEdyb3VwKHRoaXMpOworICAgICAgICAgICAgZy5sb2FkKGRpcyk7CisgICAgICAgICAgICBtR3JvdXBzLnB1dChnLmdldE5hbWUoKSwgZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkcmF3KEdMMTAgZ2wpIHsKKyAgICAgICAgSXRlcmF0b3I8R3JvdXA+IGl0ZXIgPSBtR3JvdXBzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgaXRlci5uZXh0KCkuZHJhdyhnbCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL1RleHR1cmUuamF2YSBiL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL1RleHR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2Q4OTRkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvVGV4dHVyZS5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9wZW5nbDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcHVibGljIGNsYXNzIFRleHR1cmUgeworCisgICAgcHJpdmF0ZSBpbnQgd2lkdGgsIGhlaWdodCwgYnBwOworICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBkYXRhOworICAgIHByaXZhdGUgaW50IG5hbWUgPSAtMTsKKworICAgIC8vIFRleHR1cmUgbWFwcyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0LiAgQWxsIGludGVnZXJzCisgICAgLy8gYXJlIDE2IGJpdHMsIGhpZ2ggYnl0ZSBmaXJzdC4gIFBpeGVscyBhcmUgaW4gNS82LzUKKyAgICAvLyBSR0IgZm9ybWF0LCBsb3cgYnl0ZSBmaXJzdC4KKyAgICAvLworICAgIC8vIHdpZHRoCisgICAgLy8gaGVpZ2h0CisgICAgLy8gcGl4ZWwgKDAsIDApCisgICAgLy8gcGl4ZWwgKDEsIDApCisgICAgLy8gLi4uCisgICAgLy8gcGl4ZWwgKHdpZHRoIC0gMSwgaGVpZ2h0IC0gMSkKKworICAgIHByaXZhdGUgaW50IHJlYWRJbnQxNihJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGlzLnJlYWQoKSB8IChpcy5yZWFkKCkgPDwgOCk7CisgICAgfQorCisgICAgcHVibGljIFRleHR1cmUoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMud2lkdGggID0gcmVhZEludDE2KGlzKTsKKyAgICAgICAgdGhpcy5oZWlnaHQgID0gcmVhZEludDE2KGlzKTsKKyAgICAgICAgdGhpcy5icHAgPSAyOworCisgICAgICAgIGludCBucGl4ZWxzID0gd2lkdGgqaGVpZ2h0OworICAgICAgICBpbnQgbmJ5dGVzID0gbnBpeGVscypicHA7CisgICAgICAgIGJ5dGVbXSBhcnIgPSBuZXcgYnl0ZVtuYnl0ZXNdOworCisgICAgICAgIGludCBpZHggPSAwOworICAgICAgICB3aGlsZSAoaWR4IDwgbmJ5dGVzKSB7CisgICAgICAgICAgICBpbnQgbnJlYWQgPSBpcy5yZWFkKGFyciwgaWR4LCBuYnl0ZXMgLSBpZHgpOworICAgICAgICAgICAgaWR4ICs9IG5yZWFkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpID09IEJ5dGVPcmRlci5CSUdfRU5ESUFOKSB7CisgICAgICAgICAgICAvLyBTd2FwIHBhaXJzIG9mIGJ5dGVzIG9uIGJpZy1lbmRpYW4gcGxhdGZvcm1zCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5waXhlbHM7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBqID0gaSoyOworICAgICAgICAgICAgICAgIGludCBrID0gaiArIDE7CisKKyAgICAgICAgICAgICAgICBieXRlIHRtcCA9IGFycltqXTsKKyAgICAgICAgICAgICAgICBhcnJbal0gPSBhcnJba107CisgICAgICAgICAgICAgICAgYXJyW2tdID0gdG1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhpcy5kYXRhID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChhcnIubGVuZ3RoKTsKKyAgICAgICAgdGhpcy5kYXRhLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKKyAgICAgICAgZGF0YS5wdXQoYXJyKTsKKyAgICAgICAgZGF0YS5wb3NpdGlvbigwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBsb2FkVGV4dHVyZShHTDEwIGdsLAorICAgICAgICAgICAgaW50IHRleHR1cmVVbml0LAorICAgICAgICAgICAgaW50IG1pbkZpbHRlciwgaW50IG1hZ0ZpbHRlciwKKyAgICAgICAgICAgIGludCB3cmFwUywgaW50IHdyYXBULAorICAgICAgICAgICAgaW50IG1vZGUsCisgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICBpbnQgZGF0YVR5cGUsCisgICAgICAgICAgICBCdWZmZXIgZGF0YSkgeworICAgICAgICBpbnRbXSB0ZXh0dXJlID0gbmV3IGludFsxXTsKKyAgICAgICAgZ2wuZ2xHZW5UZXh0dXJlcygxLCB0ZXh0dXJlLCAwKTsKKworICAgICAgICBnbC5nbEVuYWJsZShnbC5HTF9URVhUVVJFXzJEKTsKKyAgICAgICAgZ2wuZ2xDbGllbnRBY3RpdmVUZXh0dXJlKHRleHR1cmVVbml0KTsKKyAgICAgICAgZ2wuZ2xCaW5kVGV4dHVyZShnbC5HTF9URVhUVVJFXzJELCB0ZXh0dXJlWzBdKTsKKyAgICAgICAgZ2wuZ2xUZXhQYXJhbWV0ZXJmKGdsLkdMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICAgICAgZ2wuR0xfVEVYVFVSRV9NSU5fRklMVEVSLAorICAgICAgICAgICAgICAgIG1pbkZpbHRlcik7CisgICAgICAgIGdsLmdsVGV4UGFyYW1ldGVyZihnbC5HTF9URVhUVVJFXzJELAorICAgICAgICAgICAgICAgIGdsLkdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwKKyAgICAgICAgICAgICAgICBtYWdGaWx0ZXIpOworICAgICAgICBnbC5nbFRleFBhcmFtZXRlcmYoZ2wuR0xfVEVYVFVSRV8yRCwKKyAgICAgICAgICAgICAgICBnbC5HTF9URVhUVVJFX1dSQVBfUywKKyAgICAgICAgICAgICAgICB3cmFwUyk7CisgICAgICAgIGdsLmdsVGV4UGFyYW1ldGVyZihnbC5HTF9URVhUVVJFXzJELAorICAgICAgICAgICAgICAgIGdsLkdMX1RFWFRVUkVfV1JBUF9ULAorICAgICAgICAgICAgICAgIHdyYXBUKTsKKyAgICAgICAgZ2wuZ2xUZXhFbnZmKGdsLkdMX1RFWFRVUkVfRU5WLCBnbC5HTF9URVhUVVJFX0VOVl9NT0RFLCBtb2RlKTsKKworICAgICAgICBnbC5nbFRleEltYWdlMkQoZ2wuR0xfVEVYVFVSRV8yRCwgMCwgZ2wuR0xfUkdCLAorICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgMCwgZ2wuR0xfUkdCLCBkYXRhVHlwZSwKKyAgICAgICAgICAgICAgICBkYXRhKTsKKworICAgICAgICByZXR1cm4gdGV4dHVyZVswXTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUZXh0dXJlUGFyYW1ldGVycyhHTDEwIGdsKSB7CisgICAgICAgIGlmIChuYW1lIDwgMCkgeworICAgICAgICAgICAgbmFtZSA9IGxvYWRUZXh0dXJlKGdsLAorICAgICAgICAgICAgICAgICAgICBnbC5HTF9URVhUVVJFMCwKKyAgICAgICAgICAgICAgICAgICAgZ2wuR0xfTkVBUkVTVCwgZ2wuR0xfTkVBUkVTVCwKKyAgICAgICAgICAgICAgICAgICAgZ2wuR0xfUkVQRUFULCBnbC5HTF9SRVBFQVQsCisgICAgICAgICAgICAgICAgICAgIGdsLkdMX01PRFVMQVRFLAorICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBnbC5HTF9VTlNJR05FRF9TSE9SVF81XzZfNSwKKyAgICAgICAgICAgICAgICAgICAgZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBnbC5nbEJpbmRUZXh0dXJlKGdsLkdMX1RFWFRVUkVfMkQsIG5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL1Zpc2liaWxpdHkuamF2YSBiL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL1Zpc2liaWxpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGU0NDZmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvVmlzaWJpbGl0eS5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9wZW5nbDsKKworLyoqCisgKiBBIGNvbGxlY3Rpb24gb2YgdXRpbGl0eSBtZXRob2RzIGZvciBjb21wdXRpbmcgdGhlIHZpc2liaWxpdHkgb2YgdHJpYW5nbGUKKyAqIG1lc2hlcy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBWaXNpYmlsaXR5IHsKKyAgICAvKioKKyAgICAgKiBUZXN0IHdoZXRoZXIgYSBnaXZlbiB0cmlhbmdsZSBtZXNoIGlzIHZpc2libGUgb24gdGhlIHNjcmVlbi4gVGhlIG1lc2gKKyAgICAgKiBpcyBzcGVjaWZpZWQgYXMgYW4gaW5kZXhlZCB0cmlhbmdsZSBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHdzIHRoZSB3b3JsZCBzcGFjZSB0byBzY3JlZW4gc3BhY2UgdHJhbnNmb3JtIG1hdHJpeCwgYXMgYW4gT3BlbkdMCisgICAgICogY29sdW1uIG1hdHJpeC4KKyAgICAgKiBAcGFyYW0gd3NPZmZzZXQgYW4gaW5kZXggaW50byB0aGUgd3MgYXJyYXkgd2hlcmUgdGhlIGRhdGEgc3RhcnRzLgorICAgICAqIEBwYXJhbSBwb3NpdGlvbnMgdGhlIHZlcnRleCBwb3NpdGlvbnMgKHgsIHksIHopLgorICAgICAqIEBwYXJhbSBwb3NpdGlvbnNPZmZzZXQgdGhlIGluZGV4IGluIHRoZSBwb3NpdGlvbnMgYXJyYXkgd2hlcmUgdGhlIGRhdGEKKyAgICAgKiAgICAgICAgc3RhcnRzLgorICAgICAqIEBwYXJhbSBpbmRpY2VzIHRoZSBpbmRpY2VzIG9mIHRoZSB0cmlhbmdsZSBsaXN0LiBUaGUgaW5kaWNlcyBhcmUKKyAgICAgKiBleHByZXNzZWQgYXMgY2hhcnMgYmVjYXVzZSB0aGV5IGFyZSB1bnNpZ25lZCAxNi1iaXQgdmFsdWVzLgorICAgICAqIEBwYXJhbSBpbmRpY2VzT2Zmc2V0IHRoZSBpbmRleCBpbiB0aGUgaW5kaWNlcyBhcnJheSB3aGVyZSB0aGUgaW5kZXggZGF0YQorICAgICAqICAgICAgICBzdGFydHMuCisgICAgICogQHBhcmFtIGluZGV4Q291bnQgdGhlIG51bWJlciBvZiBpbmRpY2VzIGluIHVzZS4gVHlwaWNhbGx5IGEgbXVsdGlwbGUgb2YKKyAgICAgKiB0aHJlZS4gSWYgbm90IGEgbXVsdGlwbGUgb2YgdGhyZWUsIHRoZSByZW1haW5pbmcgb25lIG9yIHR3byBpbmRpY2VzIHdpbGwKKyAgICAgKiBiZSBpZ25vcmVkLgorICAgICAqIEByZXR1cm4gMiBpZiBhbGwgb2YgdGhlIG1lc2ggaXMgdmlzaWJsZSwgMSBpZiBzb21lIHBhcnQgb2YgdGhlIG1lc2ggaXMKKyAgICAgKiAgICAgICAgIHZpc2libGUsIDAgaWYgbm8gcGFydCBpcyB2aXNpYmxlLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgd3MgaXMgbnVsbCwgd3NPZmZzZXQgPCAwLAorICAgICAqIHBvc2l0aW9ucyBpcyBudWxsLCBwb3NpdGlvbnNPZmZzZXQgPCAwLCBpbmRpY2VzIGlzIG51bGwsCisgICAgICogaW5kaWNlc09mZnNldCA8IDAsIGluZGljZXNPZmZzZXQgPiBpbmRpY2VzLmxlbmd0aCAtIGluZGV4Q291bnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgdmlzaWJpbGl0eVRlc3QoZmxvYXRbXSB3cywgaW50IHdzT2Zmc2V0LAorICAgICAgICAgICAgZmxvYXRbXSBwb3NpdGlvbnMsIGludCBwb3NpdGlvbnNPZmZzZXQsIGNoYXJbXSBpbmRpY2VzLAorICAgICAgICAgICAgaW50IGluZGljZXNPZmZzZXQsIGludCBpbmRleENvdW50KTsKKworICAgIC8qKgorICAgICAqIEdpdmVuIGFuIE9wZW5HTCBFUyBNb2RlbFZpZXctUHJvamVjdGlvbiBtYXRyaXggKHdoaWNoIGltcGxpY2l0bHkKKyAgICAgKiBkZXNjcmliZXMgYSBmcnVzdHVtKSBhbmQgYSBsaXN0IG9mIHNwaGVyZXMsIGRldGVybWluZSB3aGljaCBzcGhlcmVzCisgICAgICogaW50ZXJzZWN0IHRoZSBmcnVzdHVtLgorICAgICAqIDxwPgorICAgICAqIEEgTW9kZWxWaWV3LVByb2plY3Rpb24gbWF0cml4IGNhbiBiZSBjb21wdXRlZCBieSBtdWx0aXBseWluZyB0aGUKKyAgICAgKiBhIFByb2plY3Rpb24gbWF0cml4IGJ5IHRoZSBhIE1vZGVsVmlldyBtYXRyaXggKGluIHRoYXQgb3JkZXIuKS4gVGhlcmUKKyAgICAgKiBhcmUgc2V2ZXJhbCBwb3NzaWJsZSB3YXlzIHRvIG9idGFpbiB0aGUgY3VycmVudCBNb2RlbFZpZXcgYW5kCisgICAgICogUHJvamVjdGlvbiBtYXRyaWNlcy4gVGhlIG1vc3QgZ2VuZXJhbGx5IGFwcGxpY2FibGUgd2F5IGlzIHRvIGtlZXAKKyAgICAgKiB0cmFjayBvZiB0aGUgY3VycmVudCBtYXRyaWNlcyBpbiBhcHBsaWNhdGlvbiBjb2RlLiBJZiB0aGF0IGlzIG5vdAorICAgICAqIGNvbnZlbmllbnQsIHRoZXJlIGFyZSB0d28gb3B0aW9uYWwgT3BlbkdMIEVTIGV4dGVuc2lvbnMgd2hpY2ggbWF5CisgICAgICogYmUgdXNlZCB0byByZWFkIHRoZSBjdXJyZW50IG1hdHJpY2VzIGZyb20gT3BlbkdMIEVTOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+R0wxMEV4dC5nbFF1ZXJ5TWF0cml4eE9FUworICAgICAqIDxsaT5HTDExLkdMX01PREVMVklFV19NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTIGFuZAorICAgICAqIEdMX1BST0pFQ1RJT05fTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUworICAgICAqIDwvdWw+CisgICAgICogVGhlIHByb2JsZW0gd2l0aCByZWFkaW5nIGJhY2sgdGhlIG1hdHJpY2VzIGlzIHRoYXQgeW91ciBhcHBsaWNhdGlvbgorICAgICAqIHdpbGwgb25seSB3b3JrIHdpdGggZGV2aWNlcyB0aGF0IHN1cHBvcnQgdGhlIGV4dGVuc2lvbihzKSB0aGF0CisgICAgICogaXQgdXNlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGZydXN0dW0gaXMgYSBzaXgtc2lkZWQgdHJ1bmNhdGVkIHB5cmFtaWQgdGhhdCBkZWZpbmVzIHRoZSBwb3J0aW9uIG9mCisgICAgICogd29ybGQgc3BhY2UgdGhhdCBpcyB2aXNpYmxlIGluIHRoZSB2aWV3LgorICAgICAqIDxwPgorICAgICAqIFNwaGVyZXMgYXJlIGRlc2NyaWJlZCBhcyBmb3VyIGZsb2F0aW5nIHBvaW50IHZhbHVlczogeCwgeSwgeiwgYW5kIHIsIGluCisgICAgICogd29ybGQtc3BhY2UgY29vcmRpbmF0ZXMuIFIgaXMgdGhlIHJhZGl1cyBvZiB0aGUgc3BoZXJlLgorICAgICAqIDxwPgorICAgICAqIEBwYXJhbSBtdnAgYSBmbG9hdCBhcnJheSBjb250YWluaW5nIHRoZSBtb2RlLXZpZXctcHJvamVjdGlvbiBtYXRyaXgKKyAgICAgKiBAcGFyYW0gbXZwT2Zmc2V0IFRoZSBvZmZzZXQgb2YgdGhlIG12cCBkYXRhIHdpdGhpbiB0aGUgbXZwIGFycmF5LgorICAgICAqIEBwYXJhbSBzcGhlcmVzIGEgZmxvYXQgYXJyYXkgY29udGFpbmluZyB0aGUgc3BoZXJlIGRhdGEuCisgICAgICogQHBhcmFtIHNwaGVyZXNPZmZzZXQgYW4gb2Zmc2V0IGludG8gdGhlIHNwaGVyZSBhcnJheSB3aGVyZSB0aGUgc3BoZXJlCisgICAgICogICAgICAgIGRhdGEgc3RhcnRzCisgICAgICogQHBhcmFtIHNwaGVyZXNDb3VudCB0aGUgbnVtYmVyIG9mIHNwaGVyZXMgdG8gY3VsbC4KKyAgICAgKiBAcGFyYW0gcmVzdWx0cyBhbiBpbnRlZ2VyIGFycmF5IGNvbnRhaW5pbmcgdGhlIGluZGljZXMgb2YgdGhlIHNwaGVyZXMKKyAgICAgKiB0aGF0IGFyZSBlaXRoZXIgY29udGFpbmVkIGVudGlyZWx5IHdpdGhpbiBvciBpbnRlcnNlY3QgdGhlIGZydXN0dW0uCisgICAgICogQHBhcmFtIHJlc3VsdHNPZmZzZXQgYW4gb2Zmc2V0IGludG8gdGhlIHJlc3VsdHMgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdHMKKyAgICAgKiAgICAgICAgc3RhcnQuCisgICAgICogQHBhcmFtIHJlc3VsdHNDYXBhY2l0eSB0aGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIGF2YWlsYWJsZSBmb3Igc3RvcmluZworICAgICAqICAgICAgICByZXN1bHRzLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzcGhlcmVzIHRoYXQgaW50ZXJzZWN0ZWQgdGhlIGZydXN0dW0uIENhbiBiZQorICAgICAqIGxhcmdlciB0aGFuIHJlc3VsdHNDYXBhY2l0eSwgaW4gd2hpY2ggY2FzZSBvbmx5IHRoZSBmaXJzdCByZXN1bHRzQ2FwYWNpdHkKKyAgICAgKiByZXN1bHRzIGFyZSB3cml0dGVuIGludG8gdGhlIHJlc3VsdHMgYXJyYXkuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtdnAgaXMgbnVsbCwgbXZwT2Zmc2V0IDwgMCwKKyAgICAgKiBtdnBPZmZzZXQgPiBtdnAubGVuZ3RoIC0gMTYsIHNwaGVyZXMgaXMgbnVsbCwgc3BoZXJlc09mZnNldCA8IDAsCisgICAgICogc3BoZXJlc09mZnNldCA+IHNwaGVyZXMubGVuZ3RoIC0gc3BoZXJlQ291bnQsCisgICAgICogcmVzdWx0cyBpcyBudWxsLCByZXN1bHRzT2Zmc2V0IDwgMCwgcmVzdWx0c09mZnNldCA+IHJlc3VsdHMubGVuZ3RoIC0KKyAgICAgKiByZXN1bHRzQ2FwYWNpdHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IGZydXN0dW1DdWxsU3BoZXJlcyhmbG9hdFtdIG12cCwgaW50IG12cE9mZnNldCwKKyAgICAgICAgICAgIGZsb2F0W10gc3BoZXJlcywgaW50IHNwaGVyZXNPZmZzZXQsIGludCBzcGhlcmVzQ291bnQsCisgICAgICAgICAgICBpbnRbXSByZXN1bHRzLCBpbnQgcmVzdWx0c09mZnNldCwgaW50IHJlc3VsdHNDYXBhY2l0eSk7CisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlIGEgYm91bmRpbmcgc3BoZXJlIGZvciBhIHNldCBvZiBwb2ludHMuIEl0IGlzIGFwcHJveGltYXRlbHkgdGhlCisgICAgICogbWluaW1hbCBib3VuZGluZyBzcGhlcmUgb2YgYW4gYXhpcy1hbGlnbmVkIGJveCB0aGF0IGJvdW5kcyB0aGUgcG9pbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9ucyBwb3NpdGlvbnMgaW4geCwgeSwgeiB0cmlwbGVzCisgICAgICogQHBhcmFtIHBvc2l0aW9uc09mZnNldCBvZmZzZXQgaW50byBwb3NpdGlvbnMgYXJyYXkKKyAgICAgKiBAcGFyYW0gcG9zaXRpb25zQ291bnQgbnVtYmVyIG9mIHBvc2l0aW9uIHRyaXBsZXMgdG8gcHJvY2VzcworICAgICAqIEBwYXJhbSBzcGhlcmUgYXJyYXkgY29udGFpbmluZyB0aGUgb3V0cHV0IGFzICh4LCB5LCB6LCByKQorICAgICAqIEBwYXJhbSBzcGhlcmVPZmZzZXQgb2Zmc2V0IHdoZXJlIHRoZSBzcGhlcmUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHBvc2l0aW9ucyBpcyBudWxsLAorICAgICAqIHBvc2l0aW9uc09mZnNldCA8IDAsIHBvc2l0aW9uc09mZnNldCA+IHBvc2l0aW9ucy5sZW5ndGggLSBwb3NpdGlvbnNDb3VudCwKKyAgICAgKiBzcGhlcmUgaXMgbnVsbCwgc3BoZXJlT2Zmc2V0IDwgMCwgc3BoZXJlT2Zmc2V0ID4gc3BoZXJlLmxlbmd0aCAtIDQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBjb21wdXRlQm91bmRpbmdTcGhlcmUoZmxvYXRbXSBwb3NpdGlvbnMsCisgICAgICAgICAgICBpbnQgcG9zaXRpb25zT2Zmc2V0LCBpbnQgcG9zaXRpb25zQ291bnQsIGZsb2F0W10gc3BoZXJlLAorICAgICAgICAgICAgaW50IHNwaGVyZU9mZnNldCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9wYWNrYWdlLmh0bWwgYi9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3NWIzMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDUgQEAKKzxIVE1MPgorPEJPRFk+CitQcm92aWRlcyBPcGVuR0wgdXRpbGl0aWVzLgorPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0VHTENvbmZpZ0ltcGwuamF2YSBiL29wZW5nbC9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9FR0xDb25maWdJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzMzkyZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9FR0xDb25maWdJbXBsLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyogCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQuZ2xlc19qbmk7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuKjsKKworcHVibGljIGNsYXNzIEVHTENvbmZpZ0ltcGwgZXh0ZW5kcyBFR0xDb25maWcgeworICAgIHByaXZhdGUgaW50IG1FR0xDb25maWc7CisKKyAgICBFR0xDb25maWdJbXBsKGludCBjb25maWcpIHsKKyAgICAgICAgbUVHTENvbmZpZyA9IGNvbmZpZzsKKyAgICB9CisgICAgCisgICAgaW50IGdldCgpIHsKKyAgICAgICAgcmV0dXJuIG1FR0xDb25maWc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0VHTENvbnRleHRJbXBsLmphdmEgYi9vcGVuZ2wvamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvRUdMQ29udGV4dEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTBjMDJmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0VHTENvbnRleHRJbXBsLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyogCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQuZ2xlc19qbmk7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuKjsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDsKKworcHVibGljIGNsYXNzIEVHTENvbnRleHRJbXBsIGV4dGVuZHMgRUdMQ29udGV4dCB7CisgICAgcHJpdmF0ZSBHTEltcGwgbUdMQ29udGV4dDsKKyAgICBpbnQgbUVHTENvbnRleHQ7CisgICAgCisgICAgcHVibGljIEVHTENvbnRleHRJbXBsKGludCBjdHgpIHsKKyAgICAgICAgbUVHTENvbnRleHQgPSBjdHg7CisgICAgICAgIG1HTENvbnRleHQgPSBuZXcgR0xJbXBsKCk7CisgICAgfQorIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBHTCBnZXRHTCgpIHsKKyAgICAgICAgcmV0dXJuIG1HTENvbnRleHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0VHTERpc3BsYXlJbXBsLmphdmEgYi9vcGVuZ2wvamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvRUdMRGlzcGxheUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzIxNjMyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0VHTERpc3BsYXlJbXBsLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyogCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQuZ2xlc19qbmk7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuKjsKKworcHVibGljIGNsYXNzIEVHTERpc3BsYXlJbXBsIGV4dGVuZHMgRUdMRGlzcGxheSB7CisgICAgaW50IG1FR0xEaXNwbGF5OworCisgICAgcHVibGljIEVHTERpc3BsYXlJbXBsKGludCBkcHkpIHsKKyAgICAgICAgbUVHTERpc3BsYXkgPSBkcHk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0VHTEltcGwuamF2YSBiL29wZW5nbC9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9FR0xJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2N2U4ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9FR0xJbXBsLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQuZ2xlc19qbmk7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuKjsKKworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworcHVibGljIGNsYXNzIEVHTEltcGwgaW1wbGVtZW50cyBFR0wxMCB7CisgICAgcHJpdmF0ZSBFR0xDb250ZXh0SW1wbCBtQ29udGV4dCA9IG5ldyBFR0xDb250ZXh0SW1wbCgtMSk7CisgICAgcHJpdmF0ZSBFR0xEaXNwbGF5SW1wbCBtRGlzcGxheSA9IG5ldyBFR0xEaXNwbGF5SW1wbCgtMSk7CisgICAgcHJpdmF0ZSBFR0xTdXJmYWNlSW1wbCBtU3VyZmFjZSA9IG5ldyBFR0xTdXJmYWNlSW1wbCgtMSk7CisKKyAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gICAgIGVnbEluaXRpYWxpemUoRUdMRGlzcGxheSBkaXNwbGF5LCBpbnRbXSBtYWpvcl9taW5vcik7CisgICAgcHVibGljIG5hdGl2ZSBib29sZWFuICAgICBlZ2xRdWVyeUNvbnRleHQoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb250ZXh0IGNvbnRleHQsIGludCBhdHRyaWJ1dGUsIGludFtdIHZhbHVlKTsgICAgCisgICAgcHVibGljIG5hdGl2ZSBib29sZWFuICAgICBlZ2xRdWVyeVN1cmZhY2UoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIGludCBhdHRyaWJ1dGUsIGludFtdIHZhbHVlKTsKKyAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gICAgIGVnbENob29zZUNvbmZpZyhFR0xEaXNwbGF5IGRpc3BsYXksIGludFtdIGF0dHJpYl9saXN0LCBFR0xDb25maWdbXSBjb25maWdzLCBpbnQgY29uZmlnX3NpemUsIGludFtdIG51bV9jb25maWcpOworICAgIHB1YmxpYyBuYXRpdmUgYm9vbGVhbiAgICAgZWdsR2V0Q29uZmlnQXR0cmliKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywgaW50IGF0dHJpYnV0ZSwgaW50W10gdmFsdWUpOworICAgIHB1YmxpYyBuYXRpdmUgYm9vbGVhbiAgICAgZWdsR2V0Q29uZmlncyhFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZ1tdIGNvbmZpZ3MsIGludCBjb25maWdfc2l6ZSwgaW50W10gbnVtX2NvbmZpZyk7ICAgIAorICAgIHB1YmxpYyBuYXRpdmUgaW50ICAgICAgICAgZWdsR2V0RXJyb3IoKTsKKyAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gICAgIGVnbERlc3Ryb3lDb250ZXh0KEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29udGV4dCBjb250ZXh0KTsKKyAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gICAgIGVnbERlc3Ryb3lTdXJmYWNlKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKKyAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gICAgIGVnbE1ha2VDdXJyZW50KEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBkcmF3LCBFR0xTdXJmYWNlIHJlYWQsIEVHTENvbnRleHQgY29udGV4dCk7CisgICAgcHVibGljIG5hdGl2ZSBTdHJpbmcgICAgICBlZ2xRdWVyeVN0cmluZyhFR0xEaXNwbGF5IGRpc3BsYXksIGludCBuYW1lKTsKKyAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gICAgIGVnbFN3YXBCdWZmZXJzKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKKyAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gICAgIGVnbFRlcm1pbmF0ZShFR0xEaXNwbGF5IGRpc3BsYXkpOworICAgIHB1YmxpYyBuYXRpdmUgYm9vbGVhbiAgICAgZWdsQ29weUJ1ZmZlcnMoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIE9iamVjdCBuYXRpdmVfcGl4bWFwKTsKKyAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gICAgIGVnbFdhaXRHTCgpOworICAgIHB1YmxpYyBuYXRpdmUgYm9vbGVhbiAgICAgZWdsV2FpdE5hdGl2ZShpbnQgZW5naW5lLCBPYmplY3QgYmluZFRhcmdldCk7CisKKyAgICBwdWJsaWMgRUdMQ29udGV4dCBlZ2xDcmVhdGVDb250ZXh0KEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywgRUdMQ29udGV4dCBzaGFyZV9jb250ZXh0LCBpbnRbXSBhdHRyaWJfbGlzdCkgeworICAgICAgICByZXR1cm4gbmV3IEVHTENvbnRleHRJbXBsKCBfZWdsQ3JlYXRlQ29udGV4dChkaXNwbGF5LCBjb25maWcsIHNoYXJlX2NvbnRleHQsIGF0dHJpYl9saXN0KSApOworICAgIH0KKworICAgIHB1YmxpYyBFR0xTdXJmYWNlIGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywgaW50W10gYXR0cmliX2xpc3QpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFR0xTdXJmYWNlSW1wbCggX2VnbENyZWF0ZVBidWZmZXJTdXJmYWNlKGRpc3BsYXksIGNvbmZpZywgYXR0cmliX2xpc3QpICk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBFR0xTdXJmYWNlIGVnbENyZWF0ZVBpeG1hcFN1cmZhY2UoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLCBPYmplY3QgbmF0aXZlX3BpeG1hcCwgaW50W10gYXR0cmliX2xpc3QpIHsKKyAgICAgICAgRUdMU3VyZmFjZUltcGwgc3VyID0gbmV3IEVHTFN1cmZhY2VJbXBsKCk7CisgICAgICAgIF9lZ2xDcmVhdGVQaXhtYXBTdXJmYWNlKHN1ciwgZGlzcGxheSwgY29uZmlnLCBuYXRpdmVfcGl4bWFwLCBhdHRyaWJfbGlzdCk7CisgICAgICAgIHJldHVybiBzdXI7CisgICAgfQorCisgICAgcHVibGljIEVHTFN1cmZhY2UgZWdsQ3JlYXRlV2luZG93U3VyZmFjZShFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBjb25maWcsIE9iamVjdCBuYXRpdmVfd2luZG93LCBpbnRbXSBhdHRyaWJfbGlzdCkgeworICAgICAgICBTdXJmYWNlIHN1cjsKKyAgICAgICAgaWYgKG5hdGl2ZV93aW5kb3cgaW5zdGFuY2VvZiBTdXJmYWNlVmlldykgeworICAgICAgICAgICAgU3VyZmFjZVZpZXcgc3VyZmFjZVZpZXcgPSAoU3VyZmFjZVZpZXcpbmF0aXZlX3dpbmRvdzsKKyAgICAgICAgICAgIHN1ciA9IHN1cmZhY2VWaWV3LmdldEhvbGRlcigpLmdldFN1cmZhY2UoKTsKKyAgICAgICAgfSBlbHNlIGlmIChuYXRpdmVfd2luZG93IGluc3RhbmNlb2YgU3VyZmFjZUhvbGRlcikgeworICAgICAgICAgICAgU3VyZmFjZUhvbGRlciBob2xkZXIgPSAoU3VyZmFjZUhvbGRlciluYXRpdmVfd2luZG93OworICAgICAgICAgICAgc3VyID0gaG9sZGVyLmdldFN1cmZhY2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgImVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoKSBjYW4gb25seSBiZSBjYWxsZWQgd2l0aCBhbiBpbnN0YW5jZSBvZiAiICsKKyAgICAgICAgICAgICAgICAiU3VyZmFjZVZpZXcgb3IgU3VyZmFjZUhvbGRlciBhdCB0aGUgbW9tZW50LCB0aGlzIHdpbGwgYmUgZml4ZWQgbGF0ZXIuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBFR0xTdXJmYWNlSW1wbCggX2VnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZGlzcGxheSwgY29uZmlnLCBzdXIsIGF0dHJpYl9saXN0KSApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEVHTERpc3BsYXkgZWdsR2V0RGlzcGxheShPYmplY3QgbmF0aXZlX2Rpc3BsYXkpIHsKKyAgICAgICAgaW50IHZhbHVlID0gX2VnbEdldERpc3BsYXkobmF0aXZlX2Rpc3BsYXkpOworICAgICAgICBpZiAobURpc3BsYXkubUVHTERpc3BsYXkgIT0gdmFsdWUpCisgICAgICAgICAgICBtRGlzcGxheSA9IG5ldyBFR0xEaXNwbGF5SW1wbCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBtRGlzcGxheTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEVHTENvbnRleHQgZWdsR2V0Q3VycmVudENvbnRleHQoKSB7CisgICAgICAgIGludCB2YWx1ZSA9IF9lZ2xHZXRDdXJyZW50Q29udGV4dCgpOworICAgICAgICBpZiAobUNvbnRleHQubUVHTENvbnRleHQgIT0gdmFsdWUpCisgICAgICAgICAgICBtQ29udGV4dCA9IG5ldyBFR0xDb250ZXh0SW1wbCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBtQ29udGV4dDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN5bmNocm9uaXplZCBFR0xEaXNwbGF5IGVnbEdldEN1cnJlbnREaXNwbGF5KCkgeworICAgICAgICBpbnQgdmFsdWUgPSBfZWdsR2V0Q3VycmVudERpc3BsYXkoKTsKKyAgICAgICAgaWYgKG1EaXNwbGF5Lm1FR0xEaXNwbGF5ICE9IHZhbHVlKQorICAgICAgICAgICAgbURpc3BsYXkgPSBuZXcgRUdMRGlzcGxheUltcGwodmFsdWUpOworICAgICAgICByZXR1cm4gbURpc3BsYXk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBFR0xTdXJmYWNlIGVnbEdldEN1cnJlbnRTdXJmYWNlKGludCByZWFkZHJhdykgeworICAgICAgICBpbnQgdmFsdWUgPSBfZWdsR2V0Q3VycmVudFN1cmZhY2UocmVhZGRyYXcpOworICAgICAgICBpZiAobVN1cmZhY2UubUVHTFN1cmZhY2UgIT0gdmFsdWUpCisgICAgICAgICAgICBtU3VyZmFjZSA9IG5ldyBFR0xTdXJmYWNlSW1wbCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBtU3VyZmFjZTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgX2VnbENyZWF0ZUNvbnRleHQoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLCBFR0xDb250ZXh0IHNoYXJlX2NvbnRleHQsIGludFtdIGF0dHJpYl9saXN0KTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgX2VnbENyZWF0ZVBidWZmZXJTdXJmYWNlKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywgaW50W10gYXR0cmliX2xpc3QpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgX2VnbENyZWF0ZVBpeG1hcFN1cmZhY2UoRUdMU3VyZmFjZSBzdXIsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywgT2JqZWN0IG5hdGl2ZV9waXhtYXAsIGludFtdIGF0dHJpYl9saXN0KTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgX2VnbENyZWF0ZVdpbmRvd1N1cmZhY2UoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLCBPYmplY3QgbmF0aXZlX3dpbmRvdywgaW50W10gYXR0cmliX2xpc3QpOyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgX2VnbEdldERpc3BsYXkoT2JqZWN0IG5hdGl2ZV9kaXNwbGF5KTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgX2VnbEdldEN1cnJlbnRDb250ZXh0KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IF9lZ2xHZXRDdXJyZW50RGlzcGxheSgpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBfZWdsR2V0Q3VycmVudFN1cmZhY2UoaW50IHJlYWRkcmF3KTsKKworICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyB2b2lkIF9uYXRpdmVDbGFzc0luaXQoKTsKKyAgICBzdGF0aWMgeyBfbmF0aXZlQ2xhc3NJbml0KCk7IH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9FR0xTdXJmYWNlSW1wbC5qYXZhIGIvb3BlbmdsL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0VHTFN1cmZhY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjYzIwMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9FR0xTdXJmYWNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qIAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLmdsZXNfam5pOworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLio7CisKK3B1YmxpYyBjbGFzcyBFR0xTdXJmYWNlSW1wbCBleHRlbmRzIEVHTFN1cmZhY2UgeworICAgIGludCBtRUdMU3VyZmFjZTsKKyAgICBwcml2YXRlIGludCBtTmF0aXZlUGl4ZWxSZWY7CisgICAgcHVibGljIEVHTFN1cmZhY2VJbXBsKCkgeworICAgICAgICBtRUdMU3VyZmFjZSA9IDA7CisgICAgICAgIG1OYXRpdmVQaXhlbFJlZiA9IDA7CisgICAgfQorICAgIHB1YmxpYyBFR0xTdXJmYWNlSW1wbChpbnQgc3VyZmFjZSkgeworICAgICAgICBtRUdMU3VyZmFjZSA9IHN1cmZhY2U7CisgICAgICAgIG1OYXRpdmVQaXhlbFJlZiA9IDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbC5qYXZhIGIvb3BlbmdsL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZjA3ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsLmphdmEKQEAgLTAsMCArMSwyMTE1IEBACisvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbC5qYXZhCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC5nbGVzX2puaTsKKworaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTBFeHQ7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExRXh0OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTFFeHRlbnNpb25QYWNrOworCitwdWJsaWMgY2xhc3MgR0xJbXBsIGltcGxlbWVudHMgR0wxMCwgR0wxMEV4dCwgR0wxMSwgR0wxMUV4dCwgR0wxMUV4dGVuc2lvblBhY2sgeworCisgICAgLy8gUHJpdmF0ZSBhY2Nlc3NvcnMgZm9yIG5hdGl2ZSBjb2RlCisKKyAgICBuYXRpdmUgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfbmF0aXZlQ2xhc3NJbml0KCk7CisgICAgc3RhdGljIHsKKwlfbmF0aXZlQ2xhc3NJbml0KCk7CisgICAgfQorCisgICAgQnVmZmVyIF9jb2xvclBvaW50ZXIgPSBudWxsOworICAgIEJ1ZmZlciBfbm9ybWFsUG9pbnRlciA9IG51bGw7CisgICAgQnVmZmVyIF90ZXhDb29yZFBvaW50ZXIgPSBudWxsOworICAgIEJ1ZmZlciBfdmVydGV4UG9pbnRlciA9IG51bGw7CisKKyAgICBwdWJsaWMgR0xJbXBsKCkgeworICAgIH0KKworICAgICBwdWJsaWMgdm9pZCBnbEdldFBvaW50ZXJ2KGludCBwbmFtZSwgamF2YS5uaW8uQnVmZmVyW10gcGFyYW1zKSB7CisgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImdsR2V0UG9pbnRlcnYiKTsKKyAgICAgfQorCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsQWN0aXZlVGV4dHVyZSAoIEdMZW51bSB0ZXh0dXJlICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEFjdGl2ZVRleHR1cmUoCisgICAgICAgIGludCB0ZXh0dXJlCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEFscGhhRnVuYyAoIEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsQWxwaGFGdW5jKAorICAgICAgICBpbnQgZnVuYywKKyAgICAgICAgZmxvYXQgcmVmCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEFscGhhRnVuY3ggKCBHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEFscGhhRnVuY3goCisgICAgICAgIGludCBmdW5jLAorICAgICAgICBpbnQgcmVmCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEJpbmRUZXh0dXJlICggR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsQmluZFRleHR1cmUoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCB0ZXh0dXJlCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEJsZW5kRnVuYyAoIEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvciApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xCbGVuZEZ1bmMoCisgICAgICAgIGludCBzZmFjdG9yLAorICAgICAgICBpbnQgZGZhY3RvcgorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xDbGVhciAoIEdMYml0ZmllbGQgbWFzayApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xDbGVhcigKKyAgICAgICAgaW50IG1hc2sKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsQ2xlYXJDb2xvciAoIEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbENsZWFyQ29sb3IoCisgICAgICAgIGZsb2F0IHJlZCwKKyAgICAgICAgZmxvYXQgZ3JlZW4sCisgICAgICAgIGZsb2F0IGJsdWUsCisgICAgICAgIGZsb2F0IGFscGhhCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbENsZWFyQ29sb3J4ICggR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsQ2xlYXJDb2xvcngoCisgICAgICAgIGludCByZWQsCisgICAgICAgIGludCBncmVlbiwKKyAgICAgICAgaW50IGJsdWUsCisgICAgICAgIGludCBhbHBoYQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xDbGVhckRlcHRoZiAoIEdMY2xhbXBmIGRlcHRoICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbENsZWFyRGVwdGhmKAorICAgICAgICBmbG9hdCBkZXB0aAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xDbGVhckRlcHRoeCAoIEdMY2xhbXB4IGRlcHRoICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbENsZWFyRGVwdGh4KAorICAgICAgICBpbnQgZGVwdGgKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsQ2xlYXJTdGVuY2lsICggR0xpbnQgcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xDbGVhclN0ZW5jaWwoCisgICAgICAgIGludCBzCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbENsaWVudEFjdGl2ZVRleHR1cmUgKCBHTGVudW0gdGV4dHVyZSApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xDbGllbnRBY3RpdmVUZXh0dXJlKAorICAgICAgICBpbnQgdGV4dHVyZQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xDb2xvcjRmICggR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xDb2xvcjRmKAorICAgICAgICBmbG9hdCByZWQsCisgICAgICAgIGZsb2F0IGdyZWVuLAorICAgICAgICBmbG9hdCBibHVlLAorICAgICAgICBmbG9hdCBhbHBoYQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xDb2xvcjR4ICggR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xDb2xvcjR4KAorICAgICAgICBpbnQgcmVkLAorICAgICAgICBpbnQgZ3JlZW4sCisgICAgICAgIGludCBibHVlLAorICAgICAgICBpbnQgYWxwaGEKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsQ29sb3JNYXNrICggR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbENvbG9yTWFzaygKKyAgICAgICAgYm9vbGVhbiByZWQsCisgICAgICAgIGJvb2xlYW4gZ3JlZW4sCisgICAgICAgIGJvb2xlYW4gYmx1ZSwKKyAgICAgICAgYm9vbGVhbiBhbHBoYQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xDb2xvclBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApCisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGdsQ29sb3JQb2ludGVyQm91bmRzKAorICAgICAgICBpbnQgc2l6ZSwKKyAgICAgICAgaW50IHR5cGUsCisgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgIGphdmEubmlvLkJ1ZmZlciBwb2ludGVyLAorICAgICAgICBpbnQgcmVtYWluaW5nCisgICAgKTsKKworICAgIHB1YmxpYyB2b2lkIGdsQ29sb3JQb2ludGVyKAorICAgICAgICBpbnQgc2l6ZSwKKyAgICAgICAgaW50IHR5cGUsCisgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgIGphdmEubmlvLkJ1ZmZlciBwb2ludGVyCisgICAgKSB7CisgICAgICAgIGlmICgoc2l6ZSA9PSA0KSAmJgorICAgICAgICAgICAgKCh0eXBlID09IEdMX0ZMT0FUKSB8fAorICAgICAgICAgICAgICh0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUpIHx8CisgICAgICAgICAgICAgKHR5cGUgPT0gR0xfRklYRUQpKSAmJgorICAgICAgICAgICAgKHN0cmlkZSA+PSAwKSkgeworICAgICAgICAgICAgX2NvbG9yUG9pbnRlciA9IHBvaW50ZXI7CisgICAgICAgIH0KKyAgICAgICAgZ2xDb2xvclBvaW50ZXJCb3VuZHMoCisgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgIHN0cmlkZSwKKyAgICAgICAgICAgIHBvaW50ZXIsCisgICAgICAgICAgICBwb2ludGVyLnJlbWFpbmluZygpCisgICAgICAgICk7CisgICAgfQorCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsQ29tcHJlc3NlZFRleEltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbENvbXByZXNzZWRUZXhJbWFnZTJEKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgbGV2ZWwsCisgICAgICAgIGludCBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgaW50IHdpZHRoLAorICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICBpbnQgYm9yZGVyLAorICAgICAgICBpbnQgaW1hZ2VTaXplLAorICAgICAgICBqYXZhLm5pby5CdWZmZXIgZGF0YQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCgKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IGxldmVsLAorICAgICAgICBpbnQgeG9mZnNldCwKKyAgICAgICAgaW50IHlvZmZzZXQsCisgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgaW50IGZvcm1hdCwKKyAgICAgICAgaW50IGltYWdlU2l6ZSwKKyAgICAgICAgamF2YS5uaW8uQnVmZmVyIGRhdGEKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsQ29weVRleEltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbENvcHlUZXhJbWFnZTJEKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgbGV2ZWwsCisgICAgICAgIGludCBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgaW50IHgsCisgICAgICAgIGludCB5LAorICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgIGludCBib3JkZXIKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsQ29weVRleFN1YkltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsQ29weVRleFN1YkltYWdlMkQoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBsZXZlbCwKKyAgICAgICAgaW50IHhvZmZzZXQsCisgICAgICAgIGludCB5b2Zmc2V0LAorICAgICAgICBpbnQgeCwKKyAgICAgICAgaW50IHksCisgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgaW50IGhlaWdodAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xDdWxsRmFjZSAoIEdMZW51bSBtb2RlICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEN1bGxGYWNlKAorICAgICAgICBpbnQgbW9kZQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xEZWxldGVUZXh0dXJlcyAoIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xEZWxldGVUZXh0dXJlcygKKyAgICAgICAgaW50IG4sCisgICAgICAgIGludFtdIHRleHR1cmVzLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbERlbGV0ZVRleHR1cmVzICggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbERlbGV0ZVRleHR1cmVzKAorICAgICAgICBpbnQgbiwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHRleHR1cmVzCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbERlcHRoRnVuYyAoIEdMZW51bSBmdW5jICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbERlcHRoRnVuYygKKyAgICAgICAgaW50IGZ1bmMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsRGVwdGhNYXNrICggR0xib29sZWFuIGZsYWcgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsRGVwdGhNYXNrKAorICAgICAgICBib29sZWFuIGZsYWcKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsRGVwdGhSYW5nZWYgKCBHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhciApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xEZXB0aFJhbmdlZigKKyAgICAgICAgZmxvYXQgek5lYXIsCisgICAgICAgIGZsb2F0IHpGYXIKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsRGVwdGhSYW5nZXggKCBHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhciApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xEZXB0aFJhbmdleCgKKyAgICAgICAgaW50IHpOZWFyLAorICAgICAgICBpbnQgekZhcgorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xEaXNhYmxlICggR0xlbnVtIGNhcCApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xEaXNhYmxlKAorICAgICAgICBpbnQgY2FwCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbERpc2FibGVDbGllbnRTdGF0ZSAoIEdMZW51bSBhcnJheSApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoCisgICAgICAgIGludCBhcnJheQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xEcmF3QXJyYXlzICggR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50ICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbERyYXdBcnJheXMoCisgICAgICAgIGludCBtb2RlLAorICAgICAgICBpbnQgZmlyc3QsCisgICAgICAgIGludCBjb3VudAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xEcmF3RWxlbWVudHMgKCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xEcmF3RWxlbWVudHMoCisgICAgICAgIGludCBtb2RlLAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBqYXZhLm5pby5CdWZmZXIgaW5kaWNlcworICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xFbmFibGUgKCBHTGVudW0gY2FwICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEVuYWJsZSgKKyAgICAgICAgaW50IGNhcAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xFbmFibGVDbGllbnRTdGF0ZSAoIEdMZW51bSBhcnJheSApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xFbmFibGVDbGllbnRTdGF0ZSgKKyAgICAgICAgaW50IGFycmF5CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEZpbmlzaCAoIHZvaWQgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsRmluaXNoKAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xGbHVzaCAoIHZvaWQgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsRmx1c2goCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEZvZ2YgKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsRm9nZigKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBmbG9hdCBwYXJhbQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xGb2dmdiAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEZvZ2Z2KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEZvZ2Z2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsRm9nZnYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uRmxvYXRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEZvZ3ggKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsRm9neCgKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnQgcGFyYW0KKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsRm9neHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xGb2d4digKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsRm9neHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xGb2d4digKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEZyb250RmFjZSAoIEdMZW51bSBtb2RlICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEZyb250RmFjZSgKKyAgICAgICAgaW50IG1vZGUKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsRnJ1c3R1bWYgKCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEZydXN0dW1mKAorICAgICAgICBmbG9hdCBsZWZ0LAorICAgICAgICBmbG9hdCByaWdodCwKKyAgICAgICAgZmxvYXQgYm90dG9tLAorICAgICAgICBmbG9hdCB0b3AsCisgICAgICAgIGZsb2F0IHpOZWFyLAorICAgICAgICBmbG9hdCB6RmFyCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEZydXN0dW14ICggR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhciApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xGcnVzdHVteCgKKyAgICAgICAgaW50IGxlZnQsCisgICAgICAgIGludCByaWdodCwKKyAgICAgICAgaW50IGJvdHRvbSwKKyAgICAgICAgaW50IHRvcCwKKyAgICAgICAgaW50IHpOZWFyLAorICAgICAgICBpbnQgekZhcgorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZW5UZXh0dXJlcyAoIEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZW5UZXh0dXJlcygKKyAgICAgICAgaW50IG4sCisgICAgICAgIGludFtdIHRleHR1cmVzLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEdlblRleHR1cmVzICggR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdlblRleHR1cmVzKAorICAgICAgICBpbnQgbiwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHRleHR1cmVzCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gR0xlbnVtIGdsR2V0RXJyb3IgKCB2b2lkICkKKworICAgIHB1YmxpYyBuYXRpdmUgaW50IGdsR2V0RXJyb3IoCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEdldEludGVnZXJ2ICggR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldEludGVnZXJ2KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRJbnRlZ2VydiAoIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRJbnRlZ2VydigKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gY29uc3QgR0x1Ynl0ZSAqIGdsR2V0U3RyaW5nICggR0xlbnVtIG5hbWUgKQorCisgICAgcHVibGljIG5hdGl2ZSBTdHJpbmcgX2dsR2V0U3RyaW5nKAorICAgICAgICBpbnQgbmFtZQorICAgICk7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdsR2V0U3RyaW5nKAorICAgICAgICBpbnQgbmFtZQorICAgICkgeworICAgICAgICBTdHJpbmcgcmV0dXJuVmFsdWU7CisgICAgICAgIHJldHVyblZhbHVlID0gX2dsR2V0U3RyaW5nKAorICAgICAgICAgICAgbmFtZQorICAgICAgICApOworICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgICAgfQorCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsSGludCAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEhpbnQoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBtb2RlCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbExpZ2h0TW9kZWxmICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbExpZ2h0TW9kZWxmKAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0IHBhcmFtCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbExpZ2h0TW9kZWxmdiAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbExpZ2h0TW9kZWxmdigKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBmbG9hdFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xMaWdodE1vZGVsZnYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xMaWdodE1vZGVsZnYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uRmxvYXRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbExpZ2h0TW9kZWx4ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbExpZ2h0TW9kZWx4KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludCBwYXJhbQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xMaWdodE1vZGVseHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xMaWdodE1vZGVseHYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbExpZ2h0TW9kZWx4diAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbExpZ2h0TW9kZWx4digKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbExpZ2h0ZiAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbExpZ2h0ZigKKyAgICAgICAgaW50IGxpZ2h0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0IHBhcmFtCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbExpZ2h0ZnYgKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbExpZ2h0ZnYoCisgICAgICAgIGludCBsaWdodCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBmbG9hdFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xMaWdodGZ2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xMaWdodGZ2KAorICAgICAgICBpbnQgbGlnaHQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uRmxvYXRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbExpZ2h0eCAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbExpZ2h0eCgKKyAgICAgICAgaW50IGxpZ2h0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludCBwYXJhbQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xMaWdodHh2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xMaWdodHh2KAorICAgICAgICBpbnQgbGlnaHQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbExpZ2h0eHYgKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbExpZ2h0eHYoCisgICAgICAgIGludCBsaWdodCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbExpbmVXaWR0aCAoIEdMZmxvYXQgd2lkdGggKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsTGluZVdpZHRoKAorICAgICAgICBmbG9hdCB3aWR0aAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xMaW5lV2lkdGh4ICggR0xmaXhlZCB3aWR0aCApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xMaW5lV2lkdGh4KAorICAgICAgICBpbnQgd2lkdGgKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsTG9hZElkZW50aXR5ICggdm9pZCApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xMb2FkSWRlbnRpdHkoCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbExvYWRNYXRyaXhmICggY29uc3QgR0xmbG9hdCAqbSApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xMb2FkTWF0cml4ZigKKyAgICAgICAgZmxvYXRbXSBtLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbExvYWRNYXRyaXhmICggY29uc3QgR0xmbG9hdCAqbSApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xMb2FkTWF0cml4ZigKKyAgICAgICAgamF2YS5uaW8uRmxvYXRCdWZmZXIgbQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xMb2FkTWF0cml4eCAoIGNvbnN0IEdMZml4ZWQgKm0gKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsTG9hZE1hdHJpeHgoCisgICAgICAgIGludFtdIG0sCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsTG9hZE1hdHJpeHggKCBjb25zdCBHTGZpeGVkICptICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbExvYWRNYXRyaXh4KAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgbQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xMb2dpY09wICggR0xlbnVtIG9wY29kZSApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xMb2dpY09wKAorICAgICAgICBpbnQgb3Bjb2RlCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbE1hdGVyaWFsZiAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsTWF0ZXJpYWxmKAorICAgICAgICBpbnQgZmFjZSwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBmbG9hdCBwYXJhbQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xNYXRlcmlhbGZ2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbE1hdGVyaWFsZnYoCisgICAgICAgIGludCBmYWNlLAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbE1hdGVyaWFsZnYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsTWF0ZXJpYWxmdigKKyAgICAgICAgaW50IGZhY2UsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uRmxvYXRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbE1hdGVyaWFseCAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsTWF0ZXJpYWx4KAorICAgICAgICBpbnQgZmFjZSwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnQgcGFyYW0KKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsTWF0ZXJpYWx4diAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xNYXRlcmlhbHh2KAorICAgICAgICBpbnQgZmFjZSwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsTWF0ZXJpYWx4diAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xNYXRlcmlhbHh2KAorICAgICAgICBpbnQgZmFjZSwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbE1hdHJpeE1vZGUgKCBHTGVudW0gbW9kZSApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xNYXRyaXhNb2RlKAorICAgICAgICBpbnQgbW9kZQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xNdWx0TWF0cml4ZiAoIGNvbnN0IEdMZmxvYXQgKm0gKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsTXVsdE1hdHJpeGYoCisgICAgICAgIGZsb2F0W10gbSwKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xNdWx0TWF0cml4ZiAoIGNvbnN0IEdMZmxvYXQgKm0gKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsTXVsdE1hdHJpeGYoCisgICAgICAgIGphdmEubmlvLkZsb2F0QnVmZmVyIG0KKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsTXVsdE1hdHJpeHggKCBjb25zdCBHTGZpeGVkICptICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbE11bHRNYXRyaXh4KAorICAgICAgICBpbnRbXSBtLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbE11bHRNYXRyaXh4ICggY29uc3QgR0xmaXhlZCAqbSApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xNdWx0TWF0cml4eCgKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIG0KKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsTXVsdGlUZXhDb29yZDRmICggR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbE11bHRpVGV4Q29vcmQ0ZigKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgZmxvYXQgcywKKyAgICAgICAgZmxvYXQgdCwKKyAgICAgICAgZmxvYXQgciwKKyAgICAgICAgZmxvYXQgcQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xNdWx0aVRleENvb3JkNHggKCBHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsTXVsdGlUZXhDb29yZDR4KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcywKKyAgICAgICAgaW50IHQsCisgICAgICAgIGludCByLAorICAgICAgICBpbnQgcQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xOb3JtYWwzZiAoIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnogKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM2YoCisgICAgICAgIGZsb2F0IG54LAorICAgICAgICBmbG9hdCBueSwKKyAgICAgICAgZmxvYXQgbnoKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsTm9ybWFsM3ggKCBHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56ICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbE5vcm1hbDN4KAorICAgICAgICBpbnQgbngsCisgICAgICAgIGludCBueSwKKyAgICAgICAgaW50IG56CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbE5vcm1hbFBvaW50ZXIgKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApCisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGdsTm9ybWFsUG9pbnRlckJvdW5kcygKKyAgICAgICAgaW50IHR5cGUsCisgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgIGphdmEubmlvLkJ1ZmZlciBwb2ludGVyLAorICAgICAgICBpbnQgcmVtYWluaW5nCisgICAgKTsKKworICAgIHB1YmxpYyB2b2lkIGdsTm9ybWFsUG9pbnRlcigKKyAgICAgICAgaW50IHR5cGUsCisgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgIGphdmEubmlvLkJ1ZmZlciBwb2ludGVyCisgICAgKSB7CisgICAgICAgIGlmICgoKHR5cGUgPT0gR0xfRkxPQVQpIHx8CisgICAgICAgICAgICAgKHR5cGUgPT0gR0xfQllURSkgfHwKKyAgICAgICAgICAgICAodHlwZSA9PSBHTF9TSE9SVCkgfHwKKyAgICAgICAgICAgICAodHlwZSA9PSBHTF9GSVhFRCkpICYmCisgICAgICAgICAgICAoc3RyaWRlID49IDApKSB7CisgICAgICAgICAgICBfbm9ybWFsUG9pbnRlciA9IHBvaW50ZXI7CisgICAgICAgIH0KKyAgICAgICAgZ2xOb3JtYWxQb2ludGVyQm91bmRzKAorICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgIHN0cmlkZSwKKyAgICAgICAgICAgIHBvaW50ZXIsCisgICAgICAgICAgICBwb2ludGVyLnJlbWFpbmluZygpCisgICAgICAgICk7CisgICAgfQorCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsT3J0aG9mICggR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xPcnRob2YoCisgICAgICAgIGZsb2F0IGxlZnQsCisgICAgICAgIGZsb2F0IHJpZ2h0LAorICAgICAgICBmbG9hdCBib3R0b20sCisgICAgICAgIGZsb2F0IHRvcCwKKyAgICAgICAgZmxvYXQgek5lYXIsCisgICAgICAgIGZsb2F0IHpGYXIKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsT3J0aG94ICggR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhciApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xPcnRob3goCisgICAgICAgIGludCBsZWZ0LAorICAgICAgICBpbnQgcmlnaHQsCisgICAgICAgIGludCBib3R0b20sCisgICAgICAgIGludCB0b3AsCisgICAgICAgIGludCB6TmVhciwKKyAgICAgICAgaW50IHpGYXIKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsUGl4ZWxTdG9yZWkgKCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFBpeGVsU3RvcmVpKAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludCBwYXJhbQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xQb2ludFNpemUgKCBHTGZsb2F0IHNpemUgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsUG9pbnRTaXplKAorICAgICAgICBmbG9hdCBzaXplCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFBvaW50U2l6ZXggKCBHTGZpeGVkIHNpemUgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsUG9pbnRTaXpleCgKKyAgICAgICAgaW50IHNpemUKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsUG9seWdvbk9mZnNldCAoIEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFBvbHlnb25PZmZzZXQoCisgICAgICAgIGZsb2F0IGZhY3RvciwKKyAgICAgICAgZmxvYXQgdW5pdHMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsUG9seWdvbk9mZnNldHggKCBHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xQb2x5Z29uT2Zmc2V0eCgKKyAgICAgICAgaW50IGZhY3RvciwKKyAgICAgICAgaW50IHVuaXRzCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFBvcE1hdHJpeCAoIHZvaWQgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsUG9wTWF0cml4KAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xQdXNoTWF0cml4ICggdm9pZCApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xQdXNoTWF0cml4KAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xSZWFkUGl4ZWxzICggR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xSZWFkUGl4ZWxzKAorICAgICAgICBpbnQgeCwKKyAgICAgICAgaW50IHksCisgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgaW50IGZvcm1hdCwKKyAgICAgICAgaW50IHR5cGUsCisgICAgICAgIGphdmEubmlvLkJ1ZmZlciBwaXhlbHMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsUm90YXRlZiAoIEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsUm90YXRlZigKKyAgICAgICAgZmxvYXQgYW5nbGUsCisgICAgICAgIGZsb2F0IHgsCisgICAgICAgIGZsb2F0IHksCisgICAgICAgIGZsb2F0IHoKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsUm90YXRleCAoIEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHogKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsUm90YXRleCgKKyAgICAgICAgaW50IGFuZ2xlLAorICAgICAgICBpbnQgeCwKKyAgICAgICAgaW50IHksCisgICAgICAgIGludCB6CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFNhbXBsZUNvdmVyYWdlICggR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsU2FtcGxlQ292ZXJhZ2UoCisgICAgICAgIGZsb2F0IHZhbHVlLAorICAgICAgICBib29sZWFuIGludmVydAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xTYW1wbGVDb3ZlcmFnZXggKCBHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xTYW1wbGVDb3ZlcmFnZXgoCisgICAgICAgIGludCB2YWx1ZSwKKyAgICAgICAgYm9vbGVhbiBpbnZlcnQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsU2NhbGVmICggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xTY2FsZWYoCisgICAgICAgIGZsb2F0IHgsCisgICAgICAgIGZsb2F0IHksCisgICAgICAgIGZsb2F0IHoKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsU2NhbGV4ICggR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xTY2FsZXgoCisgICAgICAgIGludCB4LAorICAgICAgICBpbnQgeSwKKyAgICAgICAgaW50IHoKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsU2Npc3NvciAoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFNjaXNzb3IoCisgICAgICAgIGludCB4LAorICAgICAgICBpbnQgeSwKKyAgICAgICAgaW50IHdpZHRoLAorICAgICAgICBpbnQgaGVpZ2h0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFNoYWRlTW9kZWwgKCBHTGVudW0gbW9kZSApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xTaGFkZU1vZGVsKAorICAgICAgICBpbnQgbW9kZQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xTdGVuY2lsRnVuYyAoIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFN0ZW5jaWxGdW5jKAorICAgICAgICBpbnQgZnVuYywKKyAgICAgICAgaW50IHJlZiwKKyAgICAgICAgaW50IG1hc2sKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsU3RlbmNpbE1hc2sgKCBHTHVpbnQgbWFzayApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xTdGVuY2lsTWFzaygKKyAgICAgICAgaW50IG1hc2sKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsU3RlbmNpbE9wICggR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFN0ZW5jaWxPcCgKKyAgICAgICAgaW50IGZhaWwsCisgICAgICAgIGludCB6ZmFpbCwKKyAgICAgICAgaW50IHpwYXNzCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFRleENvb3JkUG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkKKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZ2xUZXhDb29yZFBvaW50ZXJCb3VuZHMoCisgICAgICAgIGludCBzaXplLAorICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgamF2YS5uaW8uQnVmZmVyIHBvaW50ZXIsCisgICAgICAgIGludCByZW1haW5pbmcKKyAgICApOworCisgICAgcHVibGljIHZvaWQgZ2xUZXhDb29yZFBvaW50ZXIoCisgICAgICAgIGludCBzaXplLAorICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgamF2YS5uaW8uQnVmZmVyIHBvaW50ZXIKKyAgICApIHsKKyAgICAgICAgaWYgKCgoc2l6ZSA9PSAyKSB8fAorICAgICAgICAgICAgIChzaXplID09IDMpIHx8CisgICAgICAgICAgICAgKHNpemUgPT0gNCkpICYmCisgICAgICAgICAgICAoKHR5cGUgPT0gR0xfRkxPQVQpIHx8CisgICAgICAgICAgICAgKHR5cGUgPT0gR0xfQllURSkgfHwKKyAgICAgICAgICAgICAodHlwZSA9PSBHTF9TSE9SVCkgfHwKKyAgICAgICAgICAgICAodHlwZSA9PSBHTF9GSVhFRCkpICYmCisgICAgICAgICAgICAoc3RyaWRlID49IDApKSB7CisgICAgICAgICAgICBfdGV4Q29vcmRQb2ludGVyID0gcG9pbnRlcjsKKyAgICAgICAgfQorICAgICAgICBnbFRleENvb3JkUG9pbnRlckJvdW5kcygKKyAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgc3RyaWRlLAorICAgICAgICAgICAgcG9pbnRlciwKKyAgICAgICAgICAgIHBvaW50ZXIucmVtYWluaW5nKCkKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xUZXhFbnZmICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleEVudmYoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgZmxvYXQgcGFyYW0KKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsVGV4RW52ZnYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xUZXhFbnZmdigKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBmbG9hdFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xUZXhFbnZmdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleEVudmZ2KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkZsb2F0QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xUZXhFbnZ4ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleEVudngoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50IHBhcmFtCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFRleEVudnh2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4RW52eHYoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFRleEVudnh2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4RW52eHYoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4SW1hZ2UyRCgKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IGxldmVsLAorICAgICAgICBpbnQgaW50ZXJuYWxmb3JtYXQsCisgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgaW50IGJvcmRlciwKKyAgICAgICAgaW50IGZvcm1hdCwKKyAgICAgICAgaW50IHR5cGUsCisgICAgICAgIGphdmEubmlvLkJ1ZmZlciBwaXhlbHMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsVGV4UGFyYW1ldGVyZiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xUZXhQYXJhbWV0ZXJmKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0IHBhcmFtCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFRleFBhcmFtZXRlcnggKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4UGFyYW1ldGVyeCgKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnQgcGFyYW0KKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsVGV4U3ViSW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleFN1YkltYWdlMkQoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBsZXZlbCwKKyAgICAgICAgaW50IHhvZmZzZXQsCisgICAgICAgIGludCB5b2Zmc2V0LAorICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgIGludCBmb3JtYXQsCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBqYXZhLm5pby5CdWZmZXIgcGl4ZWxzCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFRyYW5zbGF0ZWYgKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFRyYW5zbGF0ZWYoCisgICAgICAgIGZsb2F0IHgsCisgICAgICAgIGZsb2F0IHksCisgICAgICAgIGZsb2F0IHoKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsVHJhbnNsYXRleCAoIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHogKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsVHJhbnNsYXRleCgKKyAgICAgICAgaW50IHgsCisgICAgICAgIGludCB5LAorICAgICAgICBpbnQgegorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xWZXJ0ZXhQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBnbFZlcnRleFBvaW50ZXJCb3VuZHMoCisgICAgICAgIGludCBzaXplLAorICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgamF2YS5uaW8uQnVmZmVyIHBvaW50ZXIsCisgICAgICAgIGludCByZW1haW5pbmcKKyAgICApOworCisgICAgcHVibGljIHZvaWQgZ2xWZXJ0ZXhQb2ludGVyKAorICAgICAgICBpbnQgc2l6ZSwKKyAgICAgICAgaW50IHR5cGUsCisgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgIGphdmEubmlvLkJ1ZmZlciBwb2ludGVyCisgICAgKSB7CisgICAgICAgIGlmICgoKHNpemUgPT0gMikgfHwKKyAgICAgICAgICAgICAoc2l6ZSA9PSAzKSB8fAorICAgICAgICAgICAgIChzaXplID09IDQpKSAmJgorICAgICAgICAgICAgKCh0eXBlID09IEdMX0ZMT0FUKSB8fAorICAgICAgICAgICAgICh0eXBlID09IEdMX0JZVEUpIHx8CisgICAgICAgICAgICAgKHR5cGUgPT0gR0xfU0hPUlQpIHx8CisgICAgICAgICAgICAgKHR5cGUgPT0gR0xfRklYRUQpKSAmJgorICAgICAgICAgICAgKHN0cmlkZSA+PSAwKSkgeworICAgICAgICAgICAgX3ZlcnRleFBvaW50ZXIgPSBwb2ludGVyOworICAgICAgICB9CisgICAgICAgIGdsVmVydGV4UG9pbnRlckJvdW5kcygKKyAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgc3RyaWRlLAorICAgICAgICAgICAgcG9pbnRlciwKKyAgICAgICAgICAgIHBvaW50ZXIucmVtYWluaW5nKCkKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xWaWV3cG9ydCAoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFZpZXdwb3J0KAorICAgICAgICBpbnQgeCwKKyAgICAgICAgaW50IHksCisgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgaW50IGhlaWdodAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIEdMYml0ZmllbGQgZ2xRdWVyeU1hdHJpeHhPRVMgKCBHTGZpeGVkICptYW50aXNzYSwgR0xpbnQgKmV4cG9uZW50ICkKKworICAgIHB1YmxpYyBuYXRpdmUgaW50IGdsUXVlcnlNYXRyaXh4T0VTKAorICAgICAgICBpbnRbXSBtYW50aXNzYSwKKyAgICAgICAgaW50IG1hbnRpc3NhT2Zmc2V0LAorICAgICAgICBpbnRbXSBleHBvbmVudCwKKyAgICAgICAgaW50IGV4cG9uZW50T2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gR0xiaXRmaWVsZCBnbFF1ZXJ5TWF0cml4eE9FUyAoIEdMZml4ZWQgKm1hbnRpc3NhLCBHTGludCAqZXhwb25lbnQgKQorCisgICAgcHVibGljIG5hdGl2ZSBpbnQgZ2xRdWVyeU1hdHJpeHhPRVMoCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBtYW50aXNzYSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIGV4cG9uZW50CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEJpbmRCdWZmZXIgKCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEJpbmRCdWZmZXIoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBidWZmZXIKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsQnVmZmVyRGF0YSAoIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsQnVmZmVyRGF0YSgKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHNpemUsCisgICAgICAgIGphdmEubmlvLkJ1ZmZlciBkYXRhLAorICAgICAgICBpbnQgdXNhZ2UKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsQnVmZmVyU3ViRGF0YSAoIEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsQnVmZmVyU3ViRGF0YSgKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IG9mZnNldCwKKyAgICAgICAgaW50IHNpemUsCisgICAgICAgIGphdmEubmlvLkJ1ZmZlciBkYXRhCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbENsaXBQbGFuZWYgKCBHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbENsaXBQbGFuZWYoCisgICAgICAgIGludCBwbGFuZSwKKyAgICAgICAgZmxvYXRbXSBlcXVhdGlvbiwKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xDbGlwUGxhbmVmICggR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbiApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xDbGlwUGxhbmVmKAorICAgICAgICBpbnQgcGxhbmUsCisgICAgICAgIGphdmEubmlvLkZsb2F0QnVmZmVyIGVxdWF0aW9uCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbENsaXBQbGFuZXggKCBHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbENsaXBQbGFuZXgoCisgICAgICAgIGludCBwbGFuZSwKKyAgICAgICAgaW50W10gZXF1YXRpb24sCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsQ2xpcFBsYW5leCAoIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24gKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsQ2xpcFBsYW5leCgKKyAgICAgICAgaW50IHBsYW5lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgZXF1YXRpb24KKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsQ29sb3I0dWIgKCBHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlLCBHTHVieXRlIGFscGhhICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbENvbG9yNHViKAorICAgICAgICBieXRlIHJlZCwKKyAgICAgICAgYnl0ZSBncmVlbiwKKyAgICAgICAgYnl0ZSBibHVlLAorICAgICAgICBieXRlIGFscGhhCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbENvbG9yUG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbENvbG9yUG9pbnRlcigKKyAgICAgICAgaW50IHNpemUsCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbERlbGV0ZUJ1ZmZlcnMgKCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYnVmZmVycyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xEZWxldGVCdWZmZXJzKAorICAgICAgICBpbnQgbiwKKyAgICAgICAgaW50W10gYnVmZmVycywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xEZWxldGVCdWZmZXJzICggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmJ1ZmZlcnMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsRGVsZXRlQnVmZmVycygKKyAgICAgICAgaW50IG4sCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBidWZmZXJzCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbERyYXdFbGVtZW50cyAoIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgR0xpbnQgb2Zmc2V0ICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbERyYXdFbGVtZW50cygKKyAgICAgICAgaW50IG1vZGUsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgaW50IHR5cGUsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2VuQnVmZmVycyAoIEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdlbkJ1ZmZlcnMoCisgICAgICAgIGludCBuLAorICAgICAgICBpbnRbXSBidWZmZXJzLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEdlbkJ1ZmZlcnMgKCBHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZW5CdWZmZXJzKAorICAgICAgICBpbnQgbiwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIGJ1ZmZlcnMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0Qm9vbGVhbnYgKCBHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldEJvb2xlYW52KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGJvb2xlYW5bXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0Qm9vbGVhbnYgKCBHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldEJvb2xlYW52KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEdldEJ1ZmZlclBhcmFtZXRlcml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldEJ1ZmZlclBhcmFtZXRlcml2KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0Q2xpcFBsYW5lZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqZXFuICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldENsaXBQbGFuZWYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgZmxvYXRbXSBlcW4sCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0Q2xpcFBsYW5lZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqZXFuICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldENsaXBQbGFuZWYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uRmxvYXRCdWZmZXIgZXFuCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEdldENsaXBQbGFuZXggKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKmVxbiApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRDbGlwUGxhbmV4KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIGVxbiwKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRDbGlwUGxhbmV4ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkICplcW4gKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0Q2xpcFBsYW5leCgKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgZXFuCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEdldEZpeGVkdiAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldEZpeGVkdigKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0Rml4ZWR2ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0Rml4ZWR2KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0RmxvYXR2ICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0RmxvYXR2KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEdldEZsb2F0diAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldEZsb2F0digKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5GbG9hdEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0TGlnaHRmdiAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0TGlnaHRmdigKKyAgICAgICAgaW50IGxpZ2h0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEdldExpZ2h0ZnYgKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldExpZ2h0ZnYoCisgICAgICAgIGludCBsaWdodCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5GbG9hdEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0TGlnaHR4diAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0TGlnaHR4digKKyAgICAgICAgaW50IGxpZ2h0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRMaWdodHh2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRMaWdodHh2KAorICAgICAgICBpbnQgbGlnaHQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRNYXRlcmlhbGZ2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldE1hdGVyaWFsZnYoCisgICAgICAgIGludCBmYWNlLAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEdldE1hdGVyaWFsZnYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0TWF0ZXJpYWxmdigKKyAgICAgICAgaW50IGZhY2UsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uRmxvYXRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEdldE1hdGVyaWFseHYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0TWF0ZXJpYWx4digKKyAgICAgICAgaW50IGZhY2UsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEdldE1hdGVyaWFseHYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0TWF0ZXJpYWx4digKKyAgICAgICAgaW50IGZhY2UsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRUZXhFbnZpdiAoIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRUZXhFbnZpdigKKyAgICAgICAgaW50IGVudiwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0VGV4RW52aXYgKCBHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0VGV4RW52aXYoCisgICAgICAgIGludCBlbnYsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRUZXhFbnZ4diAoIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldFRleEVudnh2KAorICAgICAgICBpbnQgZW52LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRUZXhFbnZ4diAoIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldFRleEVudnh2KAorICAgICAgICBpbnQgZW52LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyZnYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJmdigKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBmbG9hdFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJmdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldFRleFBhcmFtZXRlcmZ2KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkZsb2F0QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJpdigKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyaXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyaXYoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJ4diAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldFRleFBhcmFtZXRlcnh2KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJ4diAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldFRleFBhcmFtZXRlcnh2KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiBHTGJvb2xlYW4gZ2xJc0J1ZmZlciAoIEdMdWludCBidWZmZXIgKQorCisgICAgcHVibGljIG5hdGl2ZSBib29sZWFuIGdsSXNCdWZmZXIoCisgICAgICAgIGludCBidWZmZXIKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiBHTGJvb2xlYW4gZ2xJc0VuYWJsZWQgKCBHTGVudW0gY2FwICkKKworICAgIHB1YmxpYyBuYXRpdmUgYm9vbGVhbiBnbElzRW5hYmxlZCgKKyAgICAgICAgaW50IGNhcAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIEdMYm9vbGVhbiBnbElzVGV4dHVyZSAoIEdMdWludCB0ZXh0dXJlICkKKworICAgIHB1YmxpYyBuYXRpdmUgYm9vbGVhbiBnbElzVGV4dHVyZSgKKyAgICAgICAgaW50IHRleHR1cmUKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsTm9ybWFsUG9pbnRlciAoIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbE5vcm1hbFBvaW50ZXIoCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFBvaW50UGFyYW1ldGVyZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xQb2ludFBhcmFtZXRlcmYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgZmxvYXQgcGFyYW0KKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJmdiAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFBvaW50UGFyYW1ldGVyZnYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgZmxvYXRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJmdiAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFBvaW50UGFyYW1ldGVyZnYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uRmxvYXRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFBvaW50UGFyYW1ldGVyeCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xQb2ludFBhcmFtZXRlcngoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50IHBhcmFtCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFBvaW50UGFyYW1ldGVyeHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xQb2ludFBhcmFtZXRlcnh2KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xQb2ludFBhcmFtZXRlcnh2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJ4digKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFBvaW50U2l6ZVBvaW50ZXJPRVMgKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xQb2ludFNpemVQb2ludGVyT0VTKAorICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgamF2YS5uaW8uQnVmZmVyIHBvaW50ZXIKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsVGV4Q29vcmRQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmRQb2ludGVyKAorICAgICAgICBpbnQgc2l6ZSwKKyAgICAgICAgaW50IHR5cGUsCisgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsVGV4RW52aSAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4RW52aSgKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnQgcGFyYW0KKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsVGV4RW52aXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4RW52aXYoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFRleEVudml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleEVudml2KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsVGV4UGFyYW1ldGVyZnYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xUZXhQYXJhbWV0ZXJmdigKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBmbG9hdFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xUZXhQYXJhbWV0ZXJmdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleFBhcmFtZXRlcmZ2KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkZsb2F0QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xUZXhQYXJhbWV0ZXJpICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xUZXhQYXJhbWV0ZXJpKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludCBwYXJhbQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xUZXhQYXJhbWV0ZXJpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xUZXhQYXJhbWV0ZXJpdigKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsVGV4UGFyYW1ldGVyaXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4UGFyYW1ldGVyaXYoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xUZXhQYXJhbWV0ZXJ4diAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleFBhcmFtZXRlcnh2KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xUZXhQYXJhbWV0ZXJ4diAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleFBhcmFtZXRlcnh2KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsVmVydGV4UG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFZlcnRleFBvaW50ZXIoCisgICAgICAgIGludCBzaXplLAorICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUyAoIEdMdWludCBtYXRyaXhwYWxldHRlaW5kZXggKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMoCisgICAgICAgIGludCBtYXRyaXhwYWxldHRlaW5kZXgKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsRHJhd1RleGZPRVMgKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHdpZHRoLCBHTGZsb2F0IGhlaWdodCApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xEcmF3VGV4Zk9FUygKKyAgICAgICAgZmxvYXQgeCwKKyAgICAgICAgZmxvYXQgeSwKKyAgICAgICAgZmxvYXQgeiwKKyAgICAgICAgZmxvYXQgd2lkdGgsCisgICAgICAgIGZsb2F0IGhlaWdodAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xEcmF3VGV4ZnZPRVMgKCBjb25zdCBHTGZsb2F0ICpjb29yZHMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsRHJhd1RleGZ2T0VTKAorICAgICAgICBmbG9hdFtdIGNvb3JkcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xEcmF3VGV4ZnZPRVMgKCBjb25zdCBHTGZsb2F0ICpjb29yZHMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsRHJhd1RleGZ2T0VTKAorICAgICAgICBqYXZhLm5pby5GbG9hdEJ1ZmZlciBjb29yZHMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsRHJhd1RleGlPRVMgKCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0ICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbERyYXdUZXhpT0VTKAorICAgICAgICBpbnQgeCwKKyAgICAgICAgaW50IHksCisgICAgICAgIGludCB6LAorICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgIGludCBoZWlnaHQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsRHJhd1RleGl2T0VTICggY29uc3QgR0xpbnQgKmNvb3JkcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xEcmF3VGV4aXZPRVMoCisgICAgICAgIGludFtdIGNvb3JkcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xEcmF3VGV4aXZPRVMgKCBjb25zdCBHTGludCAqY29vcmRzICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbERyYXdUZXhpdk9FUygKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIGNvb3JkcworICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xEcmF3VGV4c09FUyAoIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgd2lkdGgsIEdMc2hvcnQgaGVpZ2h0ICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbERyYXdUZXhzT0VTKAorICAgICAgICBzaG9ydCB4LAorICAgICAgICBzaG9ydCB5LAorICAgICAgICBzaG9ydCB6LAorICAgICAgICBzaG9ydCB3aWR0aCwKKyAgICAgICAgc2hvcnQgaGVpZ2h0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbERyYXdUZXhzdk9FUyAoIGNvbnN0IEdMc2hvcnQgKmNvb3JkcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xEcmF3VGV4c3ZPRVMoCisgICAgICAgIHNob3J0W10gY29vcmRzLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbERyYXdUZXhzdk9FUyAoIGNvbnN0IEdMc2hvcnQgKmNvb3JkcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xEcmF3VGV4c3ZPRVMoCisgICAgICAgIGphdmEubmlvLlNob3J0QnVmZmVyIGNvb3JkcworICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xEcmF3VGV4eE9FUyAoIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgd2lkdGgsIEdMZml4ZWQgaGVpZ2h0ICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbERyYXdUZXh4T0VTKAorICAgICAgICBpbnQgeCwKKyAgICAgICAgaW50IHksCisgICAgICAgIGludCB6LAorICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgIGludCBoZWlnaHQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsRHJhd1RleHh2T0VTICggY29uc3QgR0xmaXhlZCAqY29vcmRzICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbERyYXdUZXh4dk9FUygKKyAgICAgICAgaW50W10gY29vcmRzLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbERyYXdUZXh4dk9FUyAoIGNvbnN0IEdMZml4ZWQgKmNvb3JkcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xEcmF3VGV4eHZPRVMoCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBjb29yZHMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTICggdm9pZCApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVMoCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbE1hdHJpeEluZGV4UG9pbnRlck9FUyAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbE1hdHJpeEluZGV4UG9pbnRlck9FUygKKyAgICAgICAgaW50IHNpemUsCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICBqYXZhLm5pby5CdWZmZXIgcG9pbnRlcgorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMoCisgICAgICAgIGludCBzaXplLAorICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xXZWlnaHRQb2ludGVyT0VTICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsV2VpZ2h0UG9pbnRlck9FUygKKyAgICAgICAgaW50IHNpemUsCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICBqYXZhLm5pby5CdWZmZXIgcG9pbnRlcgorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xXZWlnaHRQb2ludGVyT0VTICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsV2VpZ2h0UG9pbnRlck9FUygKKyAgICAgICAgaW50IHNpemUsCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEJpbmRGcmFtZWJ1ZmZlck9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgZnJhbWVidWZmZXIgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsQmluZEZyYW1lYnVmZmVyT0VTKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgZnJhbWVidWZmZXIKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsQmluZFJlbmRlcmJ1ZmZlck9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgcmVuZGVyYnVmZmVyICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEJpbmRSZW5kZXJidWZmZXJPRVMoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCByZW5kZXJidWZmZXIKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsQmxlbmRFcXVhdGlvbiAoIEdMaW50IG1vZGUgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsQmxlbmRFcXVhdGlvbigKKyAgICAgICAgaW50IG1vZGUKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlICggR0xpbnQgbW9kZVJHQiwgR0xpbnQgbW9kZUFscGhhICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSgKKyAgICAgICAgaW50IG1vZGVSR0IsCisgICAgICAgIGludCBtb2RlQWxwaGEKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsQmxlbmRGdW5jU2VwYXJhdGUgKCBHTGludCBzcmNSR0IsIEdMaW50IGRzdFJHQiwgR0xpbnQgc3JjQWxwaGEsIEdMaW50IGRzdEFscGhhICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEJsZW5kRnVuY1NlcGFyYXRlKAorICAgICAgICBpbnQgc3JjUkdCLAorICAgICAgICBpbnQgZHN0UkdCLAorICAgICAgICBpbnQgc3JjQWxwaGEsCisgICAgICAgIGludCBkc3RBbHBoYQorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIEdMaW50IGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUyAoIEdMaW50IHRhcmdldCApCisKKyAgICBwdWJsaWMgbmF0aXZlIGludCBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMoCisgICAgICAgIGludCB0YXJnZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTICggR0xpbnQgbiwgR0xpbnQgKmZyYW1lYnVmZmVycyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMoCisgICAgICAgIGludCBuLAorICAgICAgICBpbnRbXSBmcmFtZWJ1ZmZlcnMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTICggR0xpbnQgbiwgR0xpbnQgKmZyYW1lYnVmZmVycyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMoCisgICAgICAgIGludCBuLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgZnJhbWVidWZmZXJzCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMgKCBHTGludCBuLCBHTGludCAqcmVuZGVyYnVmZmVycyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTKAorICAgICAgICBpbnQgbiwKKyAgICAgICAgaW50W10gcmVuZGVyYnVmZmVycywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTICggR0xpbnQgbiwgR0xpbnQgKnJlbmRlcmJ1ZmZlcnMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUygKKyAgICAgICAgaW50IG4sCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciByZW5kZXJidWZmZXJzCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTICggR0xpbnQgdGFyZ2V0LCBHTGludCBhdHRhY2htZW50LCBHTGludCByZW5kZXJidWZmZXJ0YXJnZXQsIEdMaW50IHJlbmRlcmJ1ZmZlciApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUygKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IGF0dGFjaG1lbnQsCisgICAgICAgIGludCByZW5kZXJidWZmZXJ0YXJnZXQsCisgICAgICAgIGludCByZW5kZXJidWZmZXIKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IGF0dGFjaG1lbnQsIEdMaW50IHRleHRhcmdldCwgR0xpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBhdHRhY2htZW50LAorICAgICAgICBpbnQgdGV4dGFyZ2V0LAorICAgICAgICBpbnQgdGV4dHVyZSwKKyAgICAgICAgaW50IGxldmVsCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEdlbmVyYXRlTWlwbWFwT0VTICggR0xpbnQgdGFyZ2V0ICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdlbmVyYXRlTWlwbWFwT0VTKAorICAgICAgICBpbnQgdGFyZ2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEdlbkZyYW1lYnVmZmVyc09FUyAoIEdMaW50IG4sIEdMaW50ICpmcmFtZWJ1ZmZlcnMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2VuRnJhbWVidWZmZXJzT0VTKAorICAgICAgICBpbnQgbiwKKyAgICAgICAgaW50W10gZnJhbWVidWZmZXJzLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEdlbkZyYW1lYnVmZmVyc09FUyAoIEdMaW50IG4sIEdMaW50ICpmcmFtZWJ1ZmZlcnMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2VuRnJhbWVidWZmZXJzT0VTKAorICAgICAgICBpbnQgbiwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIGZyYW1lYnVmZmVycworICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZW5SZW5kZXJidWZmZXJzT0VTICggR0xpbnQgbiwgR0xpbnQgKnJlbmRlcmJ1ZmZlcnMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2VuUmVuZGVyYnVmZmVyc09FUygKKyAgICAgICAgaW50IG4sCisgICAgICAgIGludFtdIHJlbmRlcmJ1ZmZlcnMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2VuUmVuZGVyYnVmZmVyc09FUyAoIEdMaW50IG4sIEdMaW50ICpyZW5kZXJidWZmZXJzICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdlblJlbmRlcmJ1ZmZlcnNPRVMoCisgICAgICAgIGludCBuLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcmVuZGVyYnVmZmVycworICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgYXR0YWNobWVudCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBhdHRhY2htZW50LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgYXR0YWNobWVudCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBhdHRhY2htZW50LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRUZXhHZW5mdiAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbEdldFRleEdlbmZ2KAorICAgICAgICBpbnQgY29vcmQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgZmxvYXRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0VGV4R2VuZnYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRUZXhHZW5mdigKKyAgICAgICAgaW50IGNvb3JkLAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkZsb2F0QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRUZXhHZW5pdiAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRUZXhHZW5pdigKKyAgICAgICAgaW50IGNvb3JkLAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xHZXRUZXhHZW5pdiAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCisKKyAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZ2xHZXRUZXhHZW5pdigKKyAgICAgICAgaW50IGNvb3JkLAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0VGV4R2VueHYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0VGV4R2VueHYoCisgICAgICAgIGludCBjb29yZCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0VGV4R2VueHYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsR2V0VGV4R2VueHYoCisgICAgICAgIGludCBjb29yZCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gR0xib29sZWFuIGdsSXNGcmFtZWJ1ZmZlck9FUyAoIEdMaW50IGZyYW1lYnVmZmVyICkKKworICAgIHB1YmxpYyBuYXRpdmUgYm9vbGVhbiBnbElzRnJhbWVidWZmZXJPRVMoCisgICAgICAgIGludCBmcmFtZWJ1ZmZlcgorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIEdMYm9vbGVhbiBnbElzUmVuZGVyYnVmZmVyT0VTICggR0xpbnQgcmVuZGVyYnVmZmVyICkKKworICAgIHB1YmxpYyBuYXRpdmUgYm9vbGVhbiBnbElzUmVuZGVyYnVmZmVyT0VTKAorICAgICAgICBpbnQgcmVuZGVyYnVmZmVyCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0ICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgaW50IHdpZHRoLAorICAgICAgICBpbnQgaGVpZ2h0CisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFRleEdlbmYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4R2VuZigKKyAgICAgICAgaW50IGNvb3JkLAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0IHBhcmFtCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFRleEdlbmZ2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4R2VuZnYoCisgICAgICAgIGludCBjb29yZCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBmbG9hdFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xUZXhHZW5mdiAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleEdlbmZ2KAorICAgICAgICBpbnQgY29vcmQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uRmxvYXRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFRleEdlbmkgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50IHBhcmFtICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleEdlbmkoCisgICAgICAgIGludCBjb29yZCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnQgcGFyYW0KKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsVGV4R2VuaXYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4R2VuaXYoCisgICAgICAgIGludCBjb29yZCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsVGV4R2VuaXYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4R2VuaXYoCisgICAgICAgIGludCBjb29yZCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbFRleEdlbnggKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50IHBhcmFtICkKKworICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBnbFRleEdlbngoCisgICAgICAgIGludCBjb29yZCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnQgcGFyYW0KKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsVGV4R2VueHYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4R2VueHYoCisgICAgICAgIGludCBjb29yZCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsVGV4R2VueHYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQorCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIGdsVGV4R2VueHYoCisgICAgICAgIGludCBjb29yZCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3MvZWdsL0VHTC5qYXZhIGIvb3BlbmdsL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3MvZWdsL0VHTC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NDM5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9lZ2wvRUdMLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyogCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2w7CisKK3B1YmxpYyBpbnRlcmZhY2UgRUdMIHsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3MvZWdsL0VHTDEwLmphdmEgYi9vcGVuZ2wvamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9lZ2wvRUdMMTAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWU3OTNhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3MvZWdsL0VHTDEwLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbDsKKworaW1wb3J0IGphdmEubGFuZy5TdHJpbmc7CisKK3B1YmxpYyBpbnRlcmZhY2UgRUdMMTAgZXh0ZW5kcyBFR0wgeworICAgIGludCBFR0xfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgID0gMHgzMDAwOworICAgIGludCBFR0xfTk9UX0lOSVRJQUxJWkVEICAgICAgICAgICAgID0gMHgzMDAxOworICAgIGludCBFR0xfQkFEX0FDQ0VTUyAgICAgICAgICAgICAgICAgID0gMHgzMDAyOworICAgIGludCBFR0xfQkFEX0FMTE9DICAgICAgICAgICAgICAgICAgID0gMHgzMDAzOworICAgIGludCBFR0xfQkFEX0FUVFJJQlVURSAgICAgICAgICAgICAgID0gMHgzMDA0OworICAgIGludCBFR0xfQkFEX0NPTkZJRyAgICAgICAgICAgICAgICAgID0gMHgzMDA1OworICAgIGludCBFR0xfQkFEX0NPTlRFWFQgICAgICAgICAgICAgICAgID0gMHgzMDA2OworICAgIGludCBFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRSAgICAgICAgID0gMHgzMDA3OworICAgIGludCBFR0xfQkFEX0RJU1BMQVkgICAgICAgICAgICAgICAgID0gMHgzMDA4OworICAgIGludCBFR0xfQkFEX01BVENIICAgICAgICAgICAgICAgICAgID0gMHgzMDA5OworICAgIGludCBFR0xfQkFEX05BVElWRV9QSVhNQVAgICAgICAgICAgID0gMHgzMDBBOworICAgIGludCBFR0xfQkFEX05BVElWRV9XSU5ET1cgICAgICAgICAgID0gMHgzMDBCOworICAgIGludCBFR0xfQkFEX1BBUkFNRVRFUiAgICAgICAgICAgICAgID0gMHgzMDBDOworICAgIGludCBFR0xfQkFEX1NVUkZBQ0UgICAgICAgICAgICAgICAgID0gMHgzMDBEOworICAgIGludCBFR0xfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgID0gMHgzMDIwOworICAgIGludCBFR0xfQUxQSEFfU0laRSAgICAgICAgICAgICAgICAgID0gMHgzMDIxOworICAgIGludCBFR0xfQkxVRV9TSVpFICAgICAgICAgICAgICAgICAgID0gMHgzMDIyOworICAgIGludCBFR0xfR1JFRU5fU0laRSAgICAgICAgICAgICAgICAgID0gMHgzMDIzOworICAgIGludCBFR0xfUkVEX1NJWkUgICAgICAgICAgICAgICAgICAgID0gMHgzMDI0OworICAgIGludCBFR0xfREVQVEhfU0laRSAgICAgICAgICAgICAgICAgID0gMHgzMDI1OworICAgIGludCBFR0xfU1RFTkNJTF9TSVpFICAgICAgICAgICAgICAgID0gMHgzMDI2OworICAgIGludCBFR0xfQ09ORklHX0NBVkVBVCAgICAgICAgICAgICAgID0gMHgzMDI3OworICAgIGludCBFR0xfQ09ORklHX0lEICAgICAgICAgICAgICAgICAgID0gMHgzMDI4OworICAgIGludCBFR0xfTEVWRUwgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDI5OworICAgIGludCBFR0xfTUFYX1BCVUZGRVJfSEVJR0hUICAgICAgICAgID0gMHgzMDJBOworICAgIGludCBFR0xfTUFYX1BCVUZGRVJfUElYRUxTICAgICAgICAgID0gMHgzMDJCOworICAgIGludCBFR0xfTUFYX1BCVUZGRVJfV0lEVEggICAgICAgICAgID0gMHgzMDJDOworICAgIGludCBFR0xfTkFUSVZFX1JFTkRFUkFCTEUgICAgICAgICAgID0gMHgzMDJEOworICAgIGludCBFR0xfTkFUSVZFX1ZJU1VBTF9JRCAgICAgICAgICAgID0gMHgzMDJFOworICAgIGludCBFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFICAgICAgICAgID0gMHgzMDJGOworICAgIGludCBFR0xfU0FNUExFUyAgICAgICAgICAgICAgICAgICAgID0gMHgzMDMxOworICAgIGludCBFR0xfU0FNUExFX0JVRkZFUlMgICAgICAgICAgICAgID0gMHgzMDMyOworICAgIGludCBFR0xfU1VSRkFDRV9UWVBFICAgICAgICAgICAgICAgID0gMHgzMDMzOworICAgIGludCBFR0xfVFJBTlNQQVJFTlRfVFlQRSAgICAgICAgICAgID0gMHgzMDM0OworICAgIGludCBFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSAgICAgID0gMHgzMDM1OworICAgIGludCBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUgICAgID0gMHgzMDM2OworICAgIGludCBFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFICAgICAgID0gMHgzMDM3OworICAgIGludCBFR0xfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDM4OworICAgIGludCBFR0xfTFVNSU5BTkNFX1NJWkUgICAgICAgICAgICAgID0gMHgzMDNEOworICAgIGludCBFR0xfQUxQSEFfTUFTS19TSVpFICAgICAgICAgICAgID0gMHgzMDNFOworICAgIGludCBFR0xfQ09MT1JfQlVGRkVSX1RZUEUgICAgICAgICAgID0gMHgzMDNGOworICAgIGludCBFR0xfUkVOREVSQUJMRV9UWVBFICAgICAgICAgICAgID0gMHgzMDQwOworICAgIGludCBFR0xfU0xPV19DT05GSUcgICAgICAgICAgICAgICAgID0gMHgzMDUwOworICAgIGludCBFR0xfTk9OX0NPTkZPUk1BTlRfQ09ORklHICAgICAgID0gMHgzMDUxOworICAgIGludCBFR0xfVFJBTlNQQVJFTlRfUkdCICAgICAgICAgICAgID0gMHgzMDUyOworICAgIGludCBFR0xfUkdCX0JVRkZFUiAgICAgICAgICAgICAgICAgID0gMHgzMDhFOworICAgIGludCBFR0xfTFVNSU5BTkNFX0JVRkZFUiAgICAgICAgICAgID0gMHgzMDhGOworICAgIGludCBFR0xfVkVORE9SICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDUzOworICAgIGludCBFR0xfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgID0gMHgzMDU0OworICAgIGludCBFR0xfRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgID0gMHgzMDU1OworICAgIGludCBFR0xfSEVJR0hUICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDU2OworICAgIGludCBFR0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDU3OworICAgIGludCBFR0xfTEFSR0VTVF9QQlVGRkVSICAgICAgICAgICAgID0gMHgzMDU4OworICAgIGludCBFR0xfUkVOREVSX0JVRkZFUiAgICAgICAgICAgICAgID0gMHgzMDg2OworICAgIGludCBFR0xfQ09MT1JTUEFDRSAgICAgICAgICAgICAgICAgID0gMHgzMDg3OworICAgIGludCBFR0xfQUxQSEFfRk9STUFUICAgICAgICAgICAgICAgID0gMHgzMDg4OworICAgIGludCBFR0xfSE9SSVpPTlRBTF9SRVNPTFVUSU9OICAgICAgID0gMHgzMDkwOworICAgIGludCBFR0xfVkVSVElDQUxfUkVTT0xVVElPTiAgICAgICAgID0gMHgzMDkxOworICAgIGludCBFR0xfUElYRUxfQVNQRUNUX1JBVElPICAgICAgICAgID0gMHgzMDkyOworICAgIGludCBFR0xfU0lOR0xFX0JVRkZFUiAgICAgICAgICAgICAgID0gMHgzMDg1OworICAgIGludCBFR0xfQ09SRV9OQVRJVkVfRU5HSU5FICAgICAgICAgID0gMHgzMDVCOworICAgIGludCBFR0xfRFJBVyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDU5OworICAgIGludCBFR0xfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDVBOworCisgICAgaW50IEVHTF9ET05UX0NBUkUgICAgICAgICAgICAgICAgICAgPSAtMTsKKworICAgIGludCBFR0xfUEJVRkZFUl9CSVQgICAgICAgICAgICAgICAgID0gMHgwMTsKKyAgICBpbnQgRUdMX1BJWE1BUF9CSVQgICAgICAgICAgICAgICAgICA9IDB4MDI7CisgICAgaW50IEVHTF9XSU5ET1dfQklUICAgICAgICAgICAgICAgICAgPSAweDA0OworCisgICAgT2JqZWN0ICAgICBFR0xfREVGQVVMVF9ESVNQTEFZID0gbnVsbDsKKyAgICBFR0xEaXNwbGF5IEVHTF9OT19ESVNQTEFZID0gbmV3IGNvbS5nb29nbGUuYW5kcm9pZC5nbGVzX2puaS5FR0xEaXNwbGF5SW1wbCgwKTsKKyAgICBFR0xDb250ZXh0IEVHTF9OT19DT05URVhUID0gbmV3IGNvbS5nb29nbGUuYW5kcm9pZC5nbGVzX2puaS5FR0xDb250ZXh0SW1wbCgwKTsKKyAgICBFR0xTdXJmYWNlIEVHTF9OT19TVVJGQUNFID0gbmV3IGNvbS5nb29nbGUuYW5kcm9pZC5nbGVzX2puaS5FR0xTdXJmYWNlSW1wbCgwKTsKKyAgICAKKyAgICBib29sZWFuICAgICBlZ2xDaG9vc2VDb25maWcoRUdMRGlzcGxheSBkaXNwbGF5LCBpbnRbXSBhdHRyaWJfbGlzdCwgRUdMQ29uZmlnW10gY29uZmlncywgaW50IGNvbmZpZ19zaXplLCBpbnRbXSBudW1fY29uZmlnKTsKKyAgICBib29sZWFuICAgICBlZ2xDb3B5QnVmZmVycyhFR0xEaXNwbGF5IGRpc3BsYXksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgT2JqZWN0IG5hdGl2ZV9waXhtYXApOworICAgIEVHTENvbnRleHQgIGVnbENyZWF0ZUNvbnRleHQoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLCBFR0xDb250ZXh0IHNoYXJlX2NvbnRleHQsIGludFtdIGF0dHJpYl9saXN0KTsKKyAgICBFR0xTdXJmYWNlICBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZShFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBjb25maWcsIGludFtdIGF0dHJpYl9saXN0KTsKKyAgICBFR0xTdXJmYWNlICBlZ2xDcmVhdGVQaXhtYXBTdXJmYWNlKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywgT2JqZWN0IG5hdGl2ZV9waXhtYXAsIGludFtdIGF0dHJpYl9saXN0KTsKKyAgICBFR0xTdXJmYWNlICBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywgT2JqZWN0IG5hdGl2ZV93aW5kb3csIGludFtdIGF0dHJpYl9saXN0KTsKKyAgICBib29sZWFuICAgICBlZ2xEZXN0cm95Q29udGV4dChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbnRleHQgY29udGV4dCk7CisgICAgYm9vbGVhbiAgICAgZWdsRGVzdHJveVN1cmZhY2UoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOworICAgIGJvb2xlYW4gICAgIGVnbEdldENvbmZpZ0F0dHJpYihFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBjb25maWcsIGludCBhdHRyaWJ1dGUsIGludFtdIHZhbHVlKTsKKyAgICBib29sZWFuICAgICBlZ2xHZXRDb25maWdzKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnW10gY29uZmlncywgaW50IGNvbmZpZ19zaXplLCBpbnRbXSBudW1fY29uZmlnKTsKKyAgICBFR0xDb250ZXh0ICBlZ2xHZXRDdXJyZW50Q29udGV4dCgpOworICAgIEVHTERpc3BsYXkgIGVnbEdldEN1cnJlbnREaXNwbGF5KCk7CisgICAgRUdMU3VyZmFjZSAgZWdsR2V0Q3VycmVudFN1cmZhY2UoaW50IHJlYWRkcmF3KTsKKyAgICBFR0xEaXNwbGF5ICBlZ2xHZXREaXNwbGF5KE9iamVjdCBuYXRpdmVfZGlzcGxheSk7CisgICAgaW50ICAgICAgICAgZWdsR2V0RXJyb3IoKTsKKyAgICBib29sZWFuICAgICBlZ2xJbml0aWFsaXplKEVHTERpc3BsYXkgZGlzcGxheSwgaW50W10gbWFqb3JfbWlub3IpOworICAgIGJvb2xlYW4gICAgIGVnbE1ha2VDdXJyZW50KEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBkcmF3LCBFR0xTdXJmYWNlIHJlYWQsIEVHTENvbnRleHQgY29udGV4dCk7CisgICAgYm9vbGVhbiAgICAgZWdsUXVlcnlDb250ZXh0KEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29udGV4dCBjb250ZXh0LCBpbnQgYXR0cmlidXRlLCBpbnRbXSB2YWx1ZSk7CisgICAgU3RyaW5nICAgICAgZWdsUXVlcnlTdHJpbmcoRUdMRGlzcGxheSBkaXNwbGF5LCBpbnQgbmFtZSk7CisgICAgYm9vbGVhbiAgICAgZWdsUXVlcnlTdXJmYWNlKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBpbnQgYXR0cmlidXRlLCBpbnRbXSB2YWx1ZSk7CisgICAgYm9vbGVhbiAgICAgZWdsU3dhcEJ1ZmZlcnMoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOworICAgIGJvb2xlYW4gICAgIGVnbFRlcm1pbmF0ZShFR0xEaXNwbGF5IGRpc3BsYXkpOworICAgIGJvb2xlYW4gICAgIGVnbFdhaXRHTCgpOworICAgIGJvb2xlYW4gICAgIGVnbFdhaXROYXRpdmUoaW50IGVuZ2luZSwgT2JqZWN0IGJpbmRUYXJnZXQpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3MvZWdsL0VHTDExLmphdmEgYi9vcGVuZ2wvamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9lZ2wvRUdMMTEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWQ2MmU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3MvZWdsL0VHTDExLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsOworCitwdWJsaWMgaW50ZXJmYWNlIEVHTDExIGV4dGVuZHMgRUdMMTAgeworICAgIGludCBFR0xfQ09OVEVYVF9MT1NUICAgICAgICAgICAgICAgID0gMHgzMDBFOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3MvZWdsL0VHTENvbmZpZy5qYXZhIGIvb3BlbmdsL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3MvZWdsL0VHTENvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZTQ5NmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9lZ2wvRUdMQ29uZmlnLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyogCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2w7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFR0xDb25maWcKK3sKK30KZGlmZiAtLWdpdCBhL29wZW5nbC9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL2VnbC9FR0xDb250ZXh0LmphdmEgYi9vcGVuZ2wvamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9lZ2wvRUdMQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOTQ0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9lZ2wvRUdMQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qIAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsOworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFR0xDb250ZXh0Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRUdMIEVHTF9JTlNUQU5DRSA9IG5ldyBjb20uZ29vZ2xlLmFuZHJvaWQuZ2xlc19qbmkuRUdMSW1wbCgpOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgRUdMIGdldEVHTCgpIHsKKyAgICAgICAgcmV0dXJuIEVHTF9JTlNUQU5DRTsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgR0wgZ2V0R0woKTsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL2VnbC9FR0xEaXNwbGF5LmphdmEgYi9vcGVuZ2wvamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9lZ2wvRUdMRGlzcGxheS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOGE3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9lZ2wvRUdMRGlzcGxheS5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qIAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRUdMRGlzcGxheQoreworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3MvZWdsL0VHTFN1cmZhY2UuamF2YSBiL29wZW5nbC9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL2VnbC9FR0xTdXJmYWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0OWJjMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL2VnbC9FR0xTdXJmYWNlLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyogCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2w7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFR0xTdXJmYWNlCit7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhIGIvb3BlbmdsL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjc4ZjNkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wuamF2YQpAQCAtMCwwICsxLDIyIEBACisvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wuamF2YQorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgR0wgeworfQorCmRpZmYgLS1naXQgYS9vcGVuZ2wvamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwLmphdmEgYi9vcGVuZ2wvamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZjZmI1MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTAuamF2YQpAQCAtMCwwICsxLDk3MiBAQAorLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTAuamF2YQorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKKworcHVibGljIGludGVyZmFjZSBHTDEwIGV4dGVuZHMgR0wgeworICAgIGludCBHTF9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTA0OworICAgIGludCBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgICAgICAgID0gMHg4NDZFOworICAgIGludCBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgICAgICAgID0gMHg4NDZEOworICAgIGludCBHTF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA2OworICAgIGludCBHTF9BTFBIQV9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU1OworICAgIGludCBHTF9BTFBIQV9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkMwOworICAgIGludCBHTF9BTFdBWVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA3OworICAgIGludCBHTF9BTUJJRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAwOworICAgIGludCBHTF9BTUJJRU5UX0FORF9ESUZGVVNFICAgICAgICAgICAgICAgICAgID0gMHgxNjAyOworICAgIGludCBHTF9BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAxOworICAgIGludCBHTF9BTkRfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA0OworICAgIGludCBHTF9BTkRfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAyOworICAgIGludCBHTF9CQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDA1OworICAgIGludCBHTF9CTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkUyOworICAgIGludCBHTF9CTFVFX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU0OworICAgIGludCBHTF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAwOworICAgIGludCBHTF9DQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwOTAxOworICAgIGludCBHTF9DTEFNUF9UT19FREdFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MTJGOworICAgIGludCBHTF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAwOworICAgIGludCBHTF9DT0xPUl9BUlJBWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDc2OworICAgIGludCBHTF9DT0xPUl9CVUZGRVJfQklUICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAwOworICAgIGludCBHTF9DT0xPUl9MT0dJQ19PUCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkYyOworICAgIGludCBHTF9DT0xPUl9NQVRFUklBTCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjU3OworICAgIGludCBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgICAgICAgID0gMHg4NkEzOworICAgIGludCBHTF9DT05TVEFOVF9BVFRFTlVBVElPTiAgICAgICAgICAgICAgICAgID0gMHgxMjA3OworICAgIGludCBHTF9DT1BZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAzOworICAgIGludCBHTF9DT1BZX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBDOworICAgIGludCBHTF9DVUxMX0ZBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjQ0OworICAgIGludCBHTF9DVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwOTAwOworICAgIGludCBHTF9ERUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMTAxOworICAgIGludCBHTF9ERUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAzOworICAgIGludCBHTF9ERVBUSF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU2OworICAgIGludCBHTF9ERVBUSF9CVUZGRVJfQklUICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTAwOworICAgIGludCBHTF9ERVBUSF9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcxOworICAgIGludCBHTF9ESUZGVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAxOworICAgIGludCBHTF9ESVRIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkQwOworICAgIGludCBHTF9ET05UX0NBUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMTAwOworICAgIGludCBHTF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzA0OworICAgIGludCBHTF9EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzA2OworICAgIGludCBHTF9FTUlTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNjAwOworICAgIGludCBHTF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAyOworICAgIGludCBHTF9FUVVJViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA5OworICAgIGludCBHTF9FWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODAwOworICAgIGludCBHTF9FWFAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODAxOworICAgIGludCBHTF9FWFRFTlNJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAzOworICAgIGludCBHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICBpbnQgR0xfRkFTVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTEwMTsKKyAgICBpbnQgR0xfRklYRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwQzsKKyAgICBpbnQgR0xfRkxBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUQwMDsKKyAgICBpbnQgR0xfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwNjsKKyAgICBpbnQgR0xfRk9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2MDsKKyAgICBpbnQgR0xfRk9HX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2NjsKKyAgICBpbnQgR0xfRk9HX0RFTlNJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2MjsKKyAgICBpbnQgR0xfRk9HX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2NDsKKyAgICBpbnQgR0xfRk9HX0hJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEM1NDsKKyAgICBpbnQgR0xfRk9HX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2NTsKKyAgICBpbnQgR0xfRk9HX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2MzsKKyAgICBpbnQgR0xfRlJPTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQwNDsKKyAgICBpbnQgR0xfRlJPTlRfQU5EX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQwODsKKyAgICBpbnQgR0xfR0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNjsKKyAgICBpbnQgR0xfR1JFQVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNDsKKyAgICBpbnQgR0xfR1JFRU5fQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1MzsKKyAgICBpbnQgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTICA9IDB4OEI5QjsKKyAgICBpbnQgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyAgICA9IDB4OEI5QTsKKyAgICBpbnQgR0xfSU5DUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUUwMjsKKyAgICBpbnQgR0xfSU5WQUxJRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMDsKKyAgICBpbnQgR0xfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMjsKKyAgICBpbnQgR0xfSU5WQUxJRF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMTsKKyAgICBpbnQgR0xfSU5WRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwQTsKKyAgICBpbnQgR0xfS0VFUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUUwMDsKKyAgICBpbnQgR0xfTEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMzsKKyAgICBpbnQgR0xfTEVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMTsKKyAgICBpbnQgR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAgICAgICAgICAgICAgICAgICA9IDB4MEI1MzsKKyAgICBpbnQgR0xfTElHSFRfTU9ERUxfVFdPX1NJREUgICAgICAgICAgICAgICAgICA9IDB4MEI1MjsKKyAgICBpbnQgR0xfTElHSFQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMDsKKyAgICBpbnQgR0xfTElHSFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMTsKKyAgICBpbnQgR0xfTElHSFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMjsKKyAgICBpbnQgR0xfTElHSFQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMzsKKyAgICBpbnQgR0xfTElHSFQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNDsKKyAgICBpbnQgR0xfTElHSFQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNTsKKyAgICBpbnQgR0xfTElHSFQ2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNjsKKyAgICBpbnQgR0xfTElHSFQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNzsKKyAgICBpbnQgR0xfTElHSFRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI1MDsKKyAgICBpbnQgR0xfTElORV9MT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMjsKKyAgICBpbnQgR0xfTElORV9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIyMDsKKyAgICBpbnQgR0xfTElORV9TTU9PVEhfSElOVCAgICAgICAgICAgICAgICAgICAgICA9IDB4MEM1MjsKKyAgICBpbnQgR0xfTElORV9TVFJJUCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMzsKKyAgICBpbnQgR0xfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjYwMTsKKyAgICBpbnQgR0xfTElORUFSX0FUVEVOVUFUSU9OICAgICAgICAgICAgICAgICAgICA9IDB4MTIwODsKKyAgICBpbnQgR0xfTElORUFSX01JUE1BUF9MSU5FQVIgICAgICAgICAgICAgICAgICA9IDB4MjcwMzsKKyAgICBpbnQgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICAgICAgICAgICAgICAgICA9IDB4MjcwMTsKKyAgICBpbnQgR0xfTElORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMTsKKyAgICBpbnQgR0xfTFVNSU5BTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwOTsKKyAgICBpbnQgR0xfTFVNSU5BTkNFX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwQTsKKyAgICBpbnQgR0xfTUFYX0VMRU1FTlRTX0lORElDRVMgICAgICAgICAgICAgICAgICA9IDB4ODBFOTsKKyAgICBpbnQgR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTICAgICAgICAgICAgICAgICA9IDB4ODBFODsKKyAgICBpbnQgR0xfTUFYX0xJR0hUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzMTsKKyAgICBpbnQgR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSCAgICAgICAgICAgICA9IDB4MEQzNjsKKyAgICBpbnQgR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggICAgICAgICAgICA9IDB4MEQzODsKKyAgICBpbnQgR0xfTUFYX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzMzsKKyAgICBpbnQgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgICAgICAgICA9IDB4MEQzOTsKKyAgICBpbnQgR0xfTUFYX1RFWFRVUkVfVU5JVFMgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFMjsKKyAgICBpbnQgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzQTsKKyAgICBpbnQgR0xfTU9ERUxWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTcwMDsKKyAgICBpbnQgR0xfTU9EVUxBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjEwMDsKKyAgICBpbnQgR0xfTVVMVElTQU1QTEUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA5RDsKKyAgICBpbnQgR0xfTkFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwRTsKKyAgICBpbnQgR0xfTkVBUkVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjYwMDsKKyAgICBpbnQgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSICAgICAgICAgICAgICAgICA9IDB4MjcwMjsKKyAgICBpbnQgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAgICAgICAgICAgICAgICA9IDB4MjcwMDsKKyAgICBpbnQgR0xfTkVWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMDsKKyAgICBpbnQgR0xfTklDRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTEwMjsKKyAgICBpbnQgR0xfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgaW50IEdMX05PT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDU7CisgICAgaW50IEdMX05PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDg7CisgICAgaW50IEdMX05PUk1BTF9BUlJBWSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNzU7CisgICAgaW50IEdMX05PUk1BTElaRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTE7CisgICAgaW50IEdMX05PVEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDU7CisgICAgaW50IEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgICAgPSAweDg2QTI7CisgICAgaW50IEdMX09ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOworICAgIGludCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICAgICAgICAgICAgICAgICAgID0gMHgwMzA1OworICAgIGludCBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgID0gMHgwMzA3OworICAgIGludCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgID0gMHgwMzAzOworICAgIGludCBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgID0gMHgwMzAxOworICAgIGludCBHTF9PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA3OworICAgIGludCBHTF9PUl9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBEOworICAgIGludCBHTF9PUl9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBCOworICAgIGludCBHTF9PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTA1OworICAgIGludCBHTF9QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDA1OworICAgIGludCBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVMgICAgICAgICAgICAgICAgID0gMHg4QjkyOworICAgIGludCBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgID0gMHg4Qjk0OworICAgIGludCBHTF9QQUxFVFRFNF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgID0gMHg4QjkwOworICAgIGludCBHTF9QQUxFVFRFNF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4QjkzOworICAgIGludCBHTF9QQUxFVFRFNF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4QjkxOworICAgIGludCBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVMgICAgICAgICAgICAgICAgID0gMHg4Qjk3OworICAgIGludCBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgID0gMHg4Qjk5OworICAgIGludCBHTF9QQUxFVFRFOF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgID0gMHg4Qjk1OworICAgIGludCBHTF9QQUxFVFRFOF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4Qjk4OworICAgIGludCBHTF9QQUxFVFRFOF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4Qjk2OworICAgIGludCBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgICAgICAgICAgID0gMHgwQzUwOworICAgIGludCBHTF9QT0lOVF9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjEwOworICAgIGludCBHTF9QT0lOVF9TTU9PVEhfSElOVCAgICAgICAgICAgICAgICAgICAgID0gMHgwQzUxOworICAgIGludCBHTF9QT0lOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwOworICAgIGludCBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFICAgICAgICAgICAgID0gMHg4MTI4OworICAgIGludCBHTF9QT0lOVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjExOworICAgIGludCBHTF9QT0xZR09OX09GRlNFVF9GSUxMICAgICAgICAgICAgICAgICAgID0gMHg4MDM3OworICAgIGludCBHTF9QT0xZR09OX1NNT09USF9ISU5UICAgICAgICAgICAgICAgICAgID0gMHgwQzUzOworICAgIGludCBHTF9QT1NJVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAzOworICAgIGludCBHTF9QUk9KRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNzAxOworICAgIGludCBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04gICAgICAgICAgICAgICAgID0gMHgxMjA5OworICAgIGludCBHTF9SRURfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDUyOworICAgIGludCBHTF9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAxOworICAgIGludCBHTF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyOTAxOworICAgIGludCBHTF9SRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAxOworICAgIGludCBHTF9SRVNDQUxFX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDNBOworICAgIGludCBHTF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA3OworICAgIGludCBHTF9SR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA4OworICAgIGludCBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgICAgICAgID0gMHg4MDlFOworICAgIGludCBHTF9TQU1QTEVfQUxQSEFfVE9fT05FICAgICAgICAgICAgICAgICAgID0gMHg4MDlGOworICAgIGludCBHTF9TQU1QTEVfQ09WRVJBR0UgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEEwOworICAgIGludCBHTF9TQ0lTU09SX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzExOworICAgIGludCBHTF9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBGOworICAgIGludCBHTF9TSElOSU5FU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNjAxOworICAgIGludCBHTF9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAyOworICAgIGludCBHTF9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRDAxOworICAgIGludCBHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRSAgICAgICAgICAgICAgID0gMHgwQjIyOworICAgIGludCBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgICAgICAgID0gMHgwQjEyOworICAgIGludCBHTF9TUEVDVUxBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAyOworICAgIGludCBHTF9TUE9UX0NVVE9GRiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjA2OworICAgIGludCBHTF9TUE9UX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjA0OworICAgIGludCBHTF9TUE9UX0VYUE9ORU5UICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjA1OworICAgIGludCBHTF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzAyOworICAgIGludCBHTF9TUkNfQUxQSEFfU0FUVVJBVEUgICAgICAgICAgICAgICAgICAgID0gMHgwMzA4OworICAgIGludCBHTF9TUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzAwOworICAgIGludCBHTF9TVEFDS19PVkVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAzOworICAgIGludCBHTF9TVEFDS19VTkRFUkZMT1cgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTA0OworICAgIGludCBHTF9TVEVOQ0lMX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU3OworICAgIGludCBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgID0gMHgwNDAwOworICAgIGludCBHTF9TVEVOQ0lMX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkwOworICAgIGludCBHTF9TVUJQSVhFTF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDUwOworICAgIGludCBHTF9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNzAyOworICAgIGludCBHTF9URVhUVVJFXzJEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwREUxOworICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZICAgICAgICAgICAgICAgICAgID0gMHg4MDc4OworICAgIGludCBHTF9URVhUVVJFX0VOViAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMzAwOworICAgIGludCBHTF9URVhUVVJFX0VOVl9DT0xPUiAgICAgICAgICAgICAgICAgICAgID0gMHgyMjAxOworICAgIGludCBHTF9URVhUVVJFX0VOVl9NT0RFICAgICAgICAgICAgICAgICAgICAgID0gMHgyMjAwOworICAgIGludCBHTF9URVhUVVJFX01BR19GSUxURVIgICAgICAgICAgICAgICAgICAgID0gMHgyODAwOworICAgIGludCBHTF9URVhUVVJFX01JTl9GSUxURVIgICAgICAgICAgICAgICAgICAgID0gMHgyODAxOworICAgIGludCBHTF9URVhUVVJFX1dSQVBfUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyODAyOworICAgIGludCBHTF9URVhUVVJFX1dSQVBfVCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyODAzOworICAgIGludCBHTF9URVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMwOworICAgIGludCBHTF9URVhUVVJFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMxOworICAgIGludCBHTF9URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMyOworICAgIGludCBHTF9URVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMzOworICAgIGludCBHTF9URVhUVVJFNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM0OworICAgIGludCBHTF9URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM1OworICAgIGludCBHTF9URVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM2OworICAgIGludCBHTF9URVhUVVJFNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM3OworICAgIGludCBHTF9URVhUVVJFOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM4OworICAgIGludCBHTF9URVhUVVJFOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM5OworICAgIGludCBHTF9URVhUVVJFMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENBOworICAgIGludCBHTF9URVhUVVJFMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENCOworICAgIGludCBHTF9URVhUVVJFMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENDOworICAgIGludCBHTF9URVhUVVJFMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENEOworICAgIGludCBHTF9URVhUVVJFMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENFOworICAgIGludCBHTF9URVhUVVJFMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENGOworICAgIGludCBHTF9URVhUVVJFMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQwOworICAgIGludCBHTF9URVhUVVJFMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQxOworICAgIGludCBHTF9URVhUVVJFMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQyOworICAgIGludCBHTF9URVhUVVJFMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQzOworICAgIGludCBHTF9URVhUVVJFMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ0OworICAgIGludCBHTF9URVhUVVJFMjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ1OworICAgIGludCBHTF9URVhUVVJFMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ2OworICAgIGludCBHTF9URVhUVVJFMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ3OworICAgIGludCBHTF9URVhUVVJFMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ4OworICAgIGludCBHTF9URVhUVVJFMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ5OworICAgIGludCBHTF9URVhUVVJFMjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERBOworICAgIGludCBHTF9URVhUVVJFMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERCOworICAgIGludCBHTF9URVhUVVJFMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERDOworICAgIGludCBHTF9URVhUVVJFMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEREOworICAgIGludCBHTF9URVhUVVJFMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERFOworICAgIGludCBHTF9URVhUVVJFMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERGOworICAgIGludCBHTF9UUklBTkdMRV9GQU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA2OworICAgIGludCBHTF9UUklBTkdMRV9TVFJJUCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA1OworICAgIGludCBHTF9UUklBTkdMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0OworICAgIGludCBHTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTsKKyAgICBpbnQgR0xfVU5QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgICAgICA9IDB4MENGNTsKKyAgICBpbnQgR0xfVU5TSUdORURfQllURSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMTsKKyAgICBpbnQgR0xfVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMzsKKyAgICBpbnQgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAgICAgICAgICAgICAgICA9IDB4ODAzMzsKKyAgICBpbnQgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSAgICAgICAgICAgICAgICA9IDB4ODAzNDsKKyAgICBpbnQgR0xfVU5TSUdORURfU0hPUlRfNV82XzUgICAgICAgICAgICAgICAgICA9IDB4ODM2MzsKKyAgICBpbnQgR0xfVkVORE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUYwMDsKKyAgICBpbnQgR0xfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUYwMjsKKyAgICBpbnQgR0xfVkVSVEVYX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3NDsKKyAgICBpbnQgR0xfWE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwNjsKKyAgICBpbnQgR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CisKKyAgICB2b2lkIGdsQWN0aXZlVGV4dHVyZSgKKyAgICAgICAgaW50IHRleHR1cmUKKyAgICApOworCisgICAgdm9pZCBnbEFscGhhRnVuYygKKyAgICAgICAgaW50IGZ1bmMsCisgICAgICAgIGZsb2F0IHJlZgorICAgICk7CisKKyAgICB2b2lkIGdsQWxwaGFGdW5jeCgKKyAgICAgICAgaW50IGZ1bmMsCisgICAgICAgIGludCByZWYKKyAgICApOworCisgICAgdm9pZCBnbEJpbmRUZXh0dXJlKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgdGV4dHVyZQorICAgICk7CisKKyAgICB2b2lkIGdsQmxlbmRGdW5jKAorICAgICAgICBpbnQgc2ZhY3RvciwKKyAgICAgICAgaW50IGRmYWN0b3IKKyAgICApOworCisgICAgdm9pZCBnbENsZWFyKAorICAgICAgICBpbnQgbWFzaworICAgICk7CisKKyAgICB2b2lkIGdsQ2xlYXJDb2xvcigKKyAgICAgICAgZmxvYXQgcmVkLAorICAgICAgICBmbG9hdCBncmVlbiwKKyAgICAgICAgZmxvYXQgYmx1ZSwKKyAgICAgICAgZmxvYXQgYWxwaGEKKyAgICApOworCisgICAgdm9pZCBnbENsZWFyQ29sb3J4KAorICAgICAgICBpbnQgcmVkLAorICAgICAgICBpbnQgZ3JlZW4sCisgICAgICAgIGludCBibHVlLAorICAgICAgICBpbnQgYWxwaGEKKyAgICApOworCisgICAgdm9pZCBnbENsZWFyRGVwdGhmKAorICAgICAgICBmbG9hdCBkZXB0aAorICAgICk7CisKKyAgICB2b2lkIGdsQ2xlYXJEZXB0aHgoCisgICAgICAgIGludCBkZXB0aAorICAgICk7CisKKyAgICB2b2lkIGdsQ2xlYXJTdGVuY2lsKAorICAgICAgICBpbnQgcworICAgICk7CisKKyAgICB2b2lkIGdsQ2xpZW50QWN0aXZlVGV4dHVyZSgKKyAgICAgICAgaW50IHRleHR1cmUKKyAgICApOworCisgICAgdm9pZCBnbENvbG9yNGYoCisgICAgICAgIGZsb2F0IHJlZCwKKyAgICAgICAgZmxvYXQgZ3JlZW4sCisgICAgICAgIGZsb2F0IGJsdWUsCisgICAgICAgIGZsb2F0IGFscGhhCisgICAgKTsKKworICAgIHZvaWQgZ2xDb2xvcjR4KAorICAgICAgICBpbnQgcmVkLAorICAgICAgICBpbnQgZ3JlZW4sCisgICAgICAgIGludCBibHVlLAorICAgICAgICBpbnQgYWxwaGEKKyAgICApOworCisgICAgdm9pZCBnbENvbG9yTWFzaygKKyAgICAgICAgYm9vbGVhbiByZWQsCisgICAgICAgIGJvb2xlYW4gZ3JlZW4sCisgICAgICAgIGJvb2xlYW4gYmx1ZSwKKyAgICAgICAgYm9vbGVhbiBhbHBoYQorICAgICk7CisKKyAgICB2b2lkIGdsQ29sb3JQb2ludGVyKAorICAgICAgICBpbnQgc2l6ZSwKKyAgICAgICAgaW50IHR5cGUsCisgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgIGphdmEubmlvLkJ1ZmZlciBwb2ludGVyCisgICAgKTsKKworICAgIHZvaWQgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCgKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IGxldmVsLAorICAgICAgICBpbnQgaW50ZXJuYWxmb3JtYXQsCisgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgaW50IGJvcmRlciwKKyAgICAgICAgaW50IGltYWdlU2l6ZSwKKyAgICAgICAgamF2YS5uaW8uQnVmZmVyIGRhdGEKKyAgICApOworCisgICAgdm9pZCBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgbGV2ZWwsCisgICAgICAgIGludCB4b2Zmc2V0LAorICAgICAgICBpbnQgeW9mZnNldCwKKyAgICAgICAgaW50IHdpZHRoLAorICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICBpbnQgZm9ybWF0LAorICAgICAgICBpbnQgaW1hZ2VTaXplLAorICAgICAgICBqYXZhLm5pby5CdWZmZXIgZGF0YQorICAgICk7CisKKyAgICB2b2lkIGdsQ29weVRleEltYWdlMkQoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBsZXZlbCwKKyAgICAgICAgaW50IGludGVybmFsZm9ybWF0LAorICAgICAgICBpbnQgeCwKKyAgICAgICAgaW50IHksCisgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgaW50IGJvcmRlcgorICAgICk7CisKKyAgICB2b2lkIGdsQ29weVRleFN1YkltYWdlMkQoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBsZXZlbCwKKyAgICAgICAgaW50IHhvZmZzZXQsCisgICAgICAgIGludCB5b2Zmc2V0LAorICAgICAgICBpbnQgeCwKKyAgICAgICAgaW50IHksCisgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgaW50IGhlaWdodAorICAgICk7CisKKyAgICB2b2lkIGdsQ3VsbEZhY2UoCisgICAgICAgIGludCBtb2RlCisgICAgKTsKKworICAgIHZvaWQgZ2xEZWxldGVUZXh0dXJlcygKKyAgICAgICAgaW50IG4sCisgICAgICAgIGludFtdIHRleHR1cmVzLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xEZWxldGVUZXh0dXJlcygKKyAgICAgICAgaW50IG4sCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciB0ZXh0dXJlcworICAgICk7CisKKyAgICB2b2lkIGdsRGVwdGhGdW5jKAorICAgICAgICBpbnQgZnVuYworICAgICk7CisKKyAgICB2b2lkIGdsRGVwdGhNYXNrKAorICAgICAgICBib29sZWFuIGZsYWcKKyAgICApOworCisgICAgdm9pZCBnbERlcHRoUmFuZ2VmKAorICAgICAgICBmbG9hdCB6TmVhciwKKyAgICAgICAgZmxvYXQgekZhcgorICAgICk7CisKKyAgICB2b2lkIGdsRGVwdGhSYW5nZXgoCisgICAgICAgIGludCB6TmVhciwKKyAgICAgICAgaW50IHpGYXIKKyAgICApOworCisgICAgdm9pZCBnbERpc2FibGUoCisgICAgICAgIGludCBjYXAKKyAgICApOworCisgICAgdm9pZCBnbERpc2FibGVDbGllbnRTdGF0ZSgKKyAgICAgICAgaW50IGFycmF5CisgICAgKTsKKworICAgIHZvaWQgZ2xEcmF3QXJyYXlzKAorICAgICAgICBpbnQgbW9kZSwKKyAgICAgICAgaW50IGZpcnN0LAorICAgICAgICBpbnQgY291bnQKKyAgICApOworCisgICAgdm9pZCBnbERyYXdFbGVtZW50cygKKyAgICAgICAgaW50IG1vZGUsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgaW50IHR5cGUsCisgICAgICAgIGphdmEubmlvLkJ1ZmZlciBpbmRpY2VzCisgICAgKTsKKworICAgIHZvaWQgZ2xFbmFibGUoCisgICAgICAgIGludCBjYXAKKyAgICApOworCisgICAgdm9pZCBnbEVuYWJsZUNsaWVudFN0YXRlKAorICAgICAgICBpbnQgYXJyYXkKKyAgICApOworCisgICAgdm9pZCBnbEZpbmlzaCgKKyAgICApOworCisgICAgdm9pZCBnbEZsdXNoKAorICAgICk7CisKKyAgICB2b2lkIGdsRm9nZigKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBmbG9hdCBwYXJhbQorICAgICk7CisKKyAgICB2b2lkIGdsRm9nZnYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgZmxvYXRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbEZvZ2Z2KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkZsb2F0QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICB2b2lkIGdsRm9neCgKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnQgcGFyYW0KKyAgICApOworCisgICAgdm9pZCBnbEZvZ3h2KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsRm9neHYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICB2b2lkIGdsRnJvbnRGYWNlKAorICAgICAgICBpbnQgbW9kZQorICAgICk7CisKKyAgICB2b2lkIGdsRnJ1c3R1bWYoCisgICAgICAgIGZsb2F0IGxlZnQsCisgICAgICAgIGZsb2F0IHJpZ2h0LAorICAgICAgICBmbG9hdCBib3R0b20sCisgICAgICAgIGZsb2F0IHRvcCwKKyAgICAgICAgZmxvYXQgek5lYXIsCisgICAgICAgIGZsb2F0IHpGYXIKKyAgICApOworCisgICAgdm9pZCBnbEZydXN0dW14KAorICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgaW50IHJpZ2h0LAorICAgICAgICBpbnQgYm90dG9tLAorICAgICAgICBpbnQgdG9wLAorICAgICAgICBpbnQgek5lYXIsCisgICAgICAgIGludCB6RmFyCisgICAgKTsKKworICAgIHZvaWQgZ2xHZW5UZXh0dXJlcygKKyAgICAgICAgaW50IG4sCisgICAgICAgIGludFtdIHRleHR1cmVzLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xHZW5UZXh0dXJlcygKKyAgICAgICAgaW50IG4sCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciB0ZXh0dXJlcworICAgICk7CisKKyAgICBpbnQgZ2xHZXRFcnJvcigKKyAgICApOworCisgICAgdm9pZCBnbEdldEludGVnZXJ2KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsR2V0SW50ZWdlcnYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdsR2V0U3RyaW5nKAorICAgICAgICBpbnQgbmFtZQorICAgICk7CisKKyAgICB2b2lkIGdsSGludCgKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IG1vZGUKKyAgICApOworCisgICAgdm9pZCBnbExpZ2h0TW9kZWxmKAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0IHBhcmFtCisgICAgKTsKKworICAgIHZvaWQgZ2xMaWdodE1vZGVsZnYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgZmxvYXRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbExpZ2h0TW9kZWxmdigKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5GbG9hdEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgdm9pZCBnbExpZ2h0TW9kZWx4KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludCBwYXJhbQorICAgICk7CisKKyAgICB2b2lkIGdsTGlnaHRNb2RlbHh2KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsTGlnaHRNb2RlbHh2KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgdm9pZCBnbExpZ2h0ZigKKyAgICAgICAgaW50IGxpZ2h0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0IHBhcmFtCisgICAgKTsKKworICAgIHZvaWQgZ2xMaWdodGZ2KAorICAgICAgICBpbnQgbGlnaHQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgZmxvYXRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbExpZ2h0ZnYoCisgICAgICAgIGludCBsaWdodCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5GbG9hdEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgdm9pZCBnbExpZ2h0eCgKKyAgICAgICAgaW50IGxpZ2h0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludCBwYXJhbQorICAgICk7CisKKyAgICB2b2lkIGdsTGlnaHR4digKKyAgICAgICAgaW50IGxpZ2h0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsTGlnaHR4digKKyAgICAgICAgaW50IGxpZ2h0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgdm9pZCBnbExpbmVXaWR0aCgKKyAgICAgICAgZmxvYXQgd2lkdGgKKyAgICApOworCisgICAgdm9pZCBnbExpbmVXaWR0aHgoCisgICAgICAgIGludCB3aWR0aAorICAgICk7CisKKyAgICB2b2lkIGdsTG9hZElkZW50aXR5KAorICAgICk7CisKKyAgICB2b2lkIGdsTG9hZE1hdHJpeGYoCisgICAgICAgIGZsb2F0W10gbSwKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsTG9hZE1hdHJpeGYoCisgICAgICAgIGphdmEubmlvLkZsb2F0QnVmZmVyIG0KKyAgICApOworCisgICAgdm9pZCBnbExvYWRNYXRyaXh4KAorICAgICAgICBpbnRbXSBtLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xMb2FkTWF0cml4eCgKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIG0KKyAgICApOworCisgICAgdm9pZCBnbExvZ2ljT3AoCisgICAgICAgIGludCBvcGNvZGUKKyAgICApOworCisgICAgdm9pZCBnbE1hdGVyaWFsZigKKyAgICAgICAgaW50IGZhY2UsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgZmxvYXQgcGFyYW0KKyAgICApOworCisgICAgdm9pZCBnbE1hdGVyaWFsZnYoCisgICAgICAgIGludCBmYWNlLAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xNYXRlcmlhbGZ2KAorICAgICAgICBpbnQgZmFjZSwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5GbG9hdEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgdm9pZCBnbE1hdGVyaWFseCgKKyAgICAgICAgaW50IGZhY2UsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50IHBhcmFtCisgICAgKTsKKworICAgIHZvaWQgZ2xNYXRlcmlhbHh2KAorICAgICAgICBpbnQgZmFjZSwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbE1hdGVyaWFseHYoCisgICAgICAgIGludCBmYWNlLAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgdm9pZCBnbE1hdHJpeE1vZGUoCisgICAgICAgIGludCBtb2RlCisgICAgKTsKKworICAgIHZvaWQgZ2xNdWx0TWF0cml4ZigKKyAgICAgICAgZmxvYXRbXSBtLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xNdWx0TWF0cml4ZigKKyAgICAgICAgamF2YS5uaW8uRmxvYXRCdWZmZXIgbQorICAgICk7CisKKyAgICB2b2lkIGdsTXVsdE1hdHJpeHgoCisgICAgICAgIGludFtdIG0sCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbE11bHRNYXRyaXh4KAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgbQorICAgICk7CisKKyAgICB2b2lkIGdsTXVsdGlUZXhDb29yZDRmKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBmbG9hdCBzLAorICAgICAgICBmbG9hdCB0LAorICAgICAgICBmbG9hdCByLAorICAgICAgICBmbG9hdCBxCisgICAgKTsKKworICAgIHZvaWQgZ2xNdWx0aVRleENvb3JkNHgoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBzLAorICAgICAgICBpbnQgdCwKKyAgICAgICAgaW50IHIsCisgICAgICAgIGludCBxCisgICAgKTsKKworICAgIHZvaWQgZ2xOb3JtYWwzZigKKyAgICAgICAgZmxvYXQgbngsCisgICAgICAgIGZsb2F0IG55LAorICAgICAgICBmbG9hdCBuegorICAgICk7CisKKyAgICB2b2lkIGdsTm9ybWFsM3goCisgICAgICAgIGludCBueCwKKyAgICAgICAgaW50IG55LAorICAgICAgICBpbnQgbnoKKyAgICApOworCisgICAgdm9pZCBnbE5vcm1hbFBvaW50ZXIoCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICBqYXZhLm5pby5CdWZmZXIgcG9pbnRlcgorICAgICk7CisKKyAgICB2b2lkIGdsT3J0aG9mKAorICAgICAgICBmbG9hdCBsZWZ0LAorICAgICAgICBmbG9hdCByaWdodCwKKyAgICAgICAgZmxvYXQgYm90dG9tLAorICAgICAgICBmbG9hdCB0b3AsCisgICAgICAgIGZsb2F0IHpOZWFyLAorICAgICAgICBmbG9hdCB6RmFyCisgICAgKTsKKworICAgIHZvaWQgZ2xPcnRob3goCisgICAgICAgIGludCBsZWZ0LAorICAgICAgICBpbnQgcmlnaHQsCisgICAgICAgIGludCBib3R0b20sCisgICAgICAgIGludCB0b3AsCisgICAgICAgIGludCB6TmVhciwKKyAgICAgICAgaW50IHpGYXIKKyAgICApOworCisgICAgdm9pZCBnbFBpeGVsU3RvcmVpKAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludCBwYXJhbQorICAgICk7CisKKyAgICB2b2lkIGdsUG9pbnRTaXplKAorICAgICAgICBmbG9hdCBzaXplCisgICAgKTsKKworICAgIHZvaWQgZ2xQb2ludFNpemV4KAorICAgICAgICBpbnQgc2l6ZQorICAgICk7CisKKyAgICB2b2lkIGdsUG9seWdvbk9mZnNldCgKKyAgICAgICAgZmxvYXQgZmFjdG9yLAorICAgICAgICBmbG9hdCB1bml0cworICAgICk7CisKKyAgICB2b2lkIGdsUG9seWdvbk9mZnNldHgoCisgICAgICAgIGludCBmYWN0b3IsCisgICAgICAgIGludCB1bml0cworICAgICk7CisKKyAgICB2b2lkIGdsUG9wTWF0cml4KAorICAgICk7CisKKyAgICB2b2lkIGdsUHVzaE1hdHJpeCgKKyAgICApOworCisgICAgdm9pZCBnbFJlYWRQaXhlbHMoCisgICAgICAgIGludCB4LAorICAgICAgICBpbnQgeSwKKyAgICAgICAgaW50IHdpZHRoLAorICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICBpbnQgZm9ybWF0LAorICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgamF2YS5uaW8uQnVmZmVyIHBpeGVscworICAgICk7CisKKyAgICB2b2lkIGdsUm90YXRlZigKKyAgICAgICAgZmxvYXQgYW5nbGUsCisgICAgICAgIGZsb2F0IHgsCisgICAgICAgIGZsb2F0IHksCisgICAgICAgIGZsb2F0IHoKKyAgICApOworCisgICAgdm9pZCBnbFJvdGF0ZXgoCisgICAgICAgIGludCBhbmdsZSwKKyAgICAgICAgaW50IHgsCisgICAgICAgIGludCB5LAorICAgICAgICBpbnQgegorICAgICk7CisKKyAgICB2b2lkIGdsU2FtcGxlQ292ZXJhZ2UoCisgICAgICAgIGZsb2F0IHZhbHVlLAorICAgICAgICBib29sZWFuIGludmVydAorICAgICk7CisKKyAgICB2b2lkIGdsU2FtcGxlQ292ZXJhZ2V4KAorICAgICAgICBpbnQgdmFsdWUsCisgICAgICAgIGJvb2xlYW4gaW52ZXJ0CisgICAgKTsKKworICAgIHZvaWQgZ2xTY2FsZWYoCisgICAgICAgIGZsb2F0IHgsCisgICAgICAgIGZsb2F0IHksCisgICAgICAgIGZsb2F0IHoKKyAgICApOworCisgICAgdm9pZCBnbFNjYWxleCgKKyAgICAgICAgaW50IHgsCisgICAgICAgIGludCB5LAorICAgICAgICBpbnQgegorICAgICk7CisKKyAgICB2b2lkIGdsU2Npc3NvcigKKyAgICAgICAgaW50IHgsCisgICAgICAgIGludCB5LAorICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgIGludCBoZWlnaHQKKyAgICApOworCisgICAgdm9pZCBnbFNoYWRlTW9kZWwoCisgICAgICAgIGludCBtb2RlCisgICAgKTsKKworICAgIHZvaWQgZ2xTdGVuY2lsRnVuYygKKyAgICAgICAgaW50IGZ1bmMsCisgICAgICAgIGludCByZWYsCisgICAgICAgIGludCBtYXNrCisgICAgKTsKKworICAgIHZvaWQgZ2xTdGVuY2lsTWFzaygKKyAgICAgICAgaW50IG1hc2sKKyAgICApOworCisgICAgdm9pZCBnbFN0ZW5jaWxPcCgKKyAgICAgICAgaW50IGZhaWwsCisgICAgICAgIGludCB6ZmFpbCwKKyAgICAgICAgaW50IHpwYXNzCisgICAgKTsKKworICAgIHZvaWQgZ2xUZXhDb29yZFBvaW50ZXIoCisgICAgICAgIGludCBzaXplLAorICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgamF2YS5uaW8uQnVmZmVyIHBvaW50ZXIKKyAgICApOworCisgICAgdm9pZCBnbFRleEVudmYoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgZmxvYXQgcGFyYW0KKyAgICApOworCisgICAgdm9pZCBnbFRleEVudmZ2KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xUZXhFbnZmdigKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5GbG9hdEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgdm9pZCBnbFRleEVudngoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50IHBhcmFtCisgICAgKTsKKworICAgIHZvaWQgZ2xUZXhFbnZ4digKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbFRleEVudnh2KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgdm9pZCBnbFRleEltYWdlMkQoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBsZXZlbCwKKyAgICAgICAgaW50IGludGVybmFsZm9ybWF0LAorICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgIGludCBib3JkZXIsCisgICAgICAgIGludCBmb3JtYXQsCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBqYXZhLm5pby5CdWZmZXIgcGl4ZWxzCisgICAgKTsKKworICAgIHZvaWQgZ2xUZXhQYXJhbWV0ZXJmKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0IHBhcmFtCisgICAgKTsKKworICAgIHZvaWQgZ2xUZXhQYXJhbWV0ZXJ4KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludCBwYXJhbQorICAgICk7CisKKyAgICB2b2lkIGdsVGV4U3ViSW1hZ2UyRCgKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IGxldmVsLAorICAgICAgICBpbnQgeG9mZnNldCwKKyAgICAgICAgaW50IHlvZmZzZXQsCisgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgaW50IGZvcm1hdCwKKyAgICAgICAgaW50IHR5cGUsCisgICAgICAgIGphdmEubmlvLkJ1ZmZlciBwaXhlbHMKKyAgICApOworCisgICAgdm9pZCBnbFRyYW5zbGF0ZWYoCisgICAgICAgIGZsb2F0IHgsCisgICAgICAgIGZsb2F0IHksCisgICAgICAgIGZsb2F0IHoKKyAgICApOworCisgICAgdm9pZCBnbFRyYW5zbGF0ZXgoCisgICAgICAgIGludCB4LAorICAgICAgICBpbnQgeSwKKyAgICAgICAgaW50IHoKKyAgICApOworCisgICAgdm9pZCBnbFZlcnRleFBvaW50ZXIoCisgICAgICAgIGludCBzaXplLAorICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgamF2YS5uaW8uQnVmZmVyIHBvaW50ZXIKKyAgICApOworCisgICAgdm9pZCBnbFZpZXdwb3J0KAorICAgICAgICBpbnQgeCwKKyAgICAgICAgaW50IHksCisgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgaW50IGhlaWdodAorICAgICk7CisKK30KZGlmZiAtLWdpdCBhL29wZW5nbC9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTBFeHQuamF2YSBiL29wZW5nbC9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTBFeHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjJiMjBhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMEV4dC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisKK3BhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgR0wxMEV4dCBleHRlbmRzIEdMIHsKKworICAgIGludCBnbFF1ZXJ5TWF0cml4eE9FUygKKyAgICAgICAgaW50W10gbWFudGlzc2EsCisgICAgICAgIGludCBtYW50aXNzYU9mZnNldCwKKyAgICAgICAgaW50W10gZXhwb25lbnQsCisgICAgICAgIGludCBleHBvbmVudE9mZnNldAorICAgICk7CisKKyAgICBpbnQgZ2xRdWVyeU1hdHJpeHhPRVMoCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBtYW50aXNzYSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIGV4cG9uZW50CisgICAgKTsKKworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMS5qYXZhIGIvb3BlbmdsL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYTExMGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExLmphdmEKQEAgLTAsMCArMSw1NTAgQEAKKy8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExLmphdmEKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisKK3BhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgR0wxMSBleHRlbmRzIEdMMTAgeworICAgIGludCBHTF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RTA7CisgICAgaW50IEdMX0FERF9TSUdORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3NDsKKyAgICBpbnQgR0xfQUxQSEFfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDFDOworICAgIGludCBHTF9BTFBIQV9URVNUX0ZVTkMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQzE7CisgICAgaW50IEdMX0FMUEhBX1RFU1RfUkVGICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJDMjsKKyAgICBpbnQgR0xfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODkyOworICAgIGludCBHTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICAgICAgICAgPSAweDg4OTQ7CisgICAgaW50IEdMX0JMRU5EX0RTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJFMDsKKyAgICBpbnQgR0xfQkxFTkRfU1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkUxOworICAgIGludCBHTF9CVUZGRVJfQUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4QkI7CisgICAgaW50IEdMX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODc2NDsKKyAgICBpbnQgR0xfQlVGRkVSX1VTQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NzY1OworICAgIGludCBHTF9DTElFTlRfQUNUSVZFX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgPSAweDg0RTE7CisgICAgaW50IEdMX0NMSVBfUExBTkUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwMDsKKyAgICBpbnQgR0xfQ0xJUF9QTEFORTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDAxOworICAgIGludCBHTF9DTElQX1BMQU5FMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDI7CisgICAgaW50IEdMX0NMSVBfUExBTkUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwMzsKKyAgICBpbnQgR0xfQ0xJUF9QTEFORTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDA0OworICAgIGludCBHTF9DTElQX1BMQU5FNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDU7CisgICAgaW50IEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgICA9IDB4ODg5ODsKKyAgICBpbnQgR0xfQ09MT1JfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgID0gMHg4MDkwOworICAgIGludCBHTF9DT0xPUl9BUlJBWV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwODE7CisgICAgaW50IEdMX0NPTE9SX0FSUkFZX1NUUklERSAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA4MzsKKyAgICBpbnQgR0xfQ09MT1JfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDgyOworICAgIGludCBHTF9DT0xPUl9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDMjI7CisgICAgaW50IEdMX0NPTE9SX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMyMzsKKyAgICBpbnQgR0xfQ09NQklORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTcwOworICAgIGludCBHTF9DT01CSU5FX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzI7CisgICAgaW50IEdMX0NPTUJJTkVfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3MTsKKyAgICBpbnQgR0xfQ09OU1RBTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc2OworICAgIGludCBHTF9DT09SRF9SRVBMQUNFX09FUyAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4NjI7CisgICAgaW50IEdMX0NVTExfRkFDRV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI0NTsKKyAgICBpbnQgR0xfQ1VSUkVOVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjAwOworICAgIGludCBHTF9DVVJSRU5UX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMDI7CisgICAgaW50IEdMX0NVUlJFTlRfVEVYVFVSRV9DT09SRFMgICAgICAgICAgICAgICAgICA9IDB4MEIwMzsKKyAgICBpbnQgR0xfREVQVEhfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjczOworICAgIGludCBHTF9ERVBUSF9GVU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzQ7CisgICAgaW50IEdMX0RFUFRIX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI3MDsKKyAgICBpbnQgR0xfREVQVEhfV1JJVEVNQVNLICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcyOworICAgIGludCBHTF9ET1QzX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg2QUU7CisgICAgaW50IEdMX0RPVDNfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBRjsKKyAgICBpbnQgR0xfRFlOQU1JQ19EUkFXICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEU4OworICAgIGludCBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgPSAweDg4OTM7CisgICAgaW50IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICA9IDB4ODg5NTsKKyAgICBpbnQgR0xfRlJPTlRfRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjQ2OworICAgIGludCBHTF9HRU5FUkFURV9NSVBNQVAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxOTE7CisgICAgaW50IEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UICAgICAgICAgICAgICAgICAgICA9IDB4ODE5MjsKKyAgICBpbnQgR0xfSU5URVJQT0xBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc1OworICAgIGludCBHTF9MSU5FX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMjE7CisgICAgaW50IEdMX0xPR0lDX09QX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJGMDsKKyAgICBpbnQgR0xfTUFUUklYX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkEwOworICAgIGludCBHTF9NQVhfQ0xJUF9QTEFORVMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMzI7CisgICAgaW50IEdMX01PREVMVklFV19NQVRSSVggICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBNjsKKyAgICBpbnQgR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgID0gMHg4OThEOworICAgIGludCBHTF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggICAgICAgICAgICAgICAgICAgPSAweDBCQTM7CisgICAgaW50IEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICA9IDB4ODg5NzsKKyAgICBpbnQgR0xfTk9STUFMX0FSUkFZX1BPSU5URVIgICAgICAgICAgICAgICAgICAgID0gMHg4MDhGOworICAgIGludCBHTF9OT1JNQUxfQVJSQVlfU1RSSURFICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0Y7CisgICAgaW50IEdMX05PUk1BTF9BUlJBWV9UWVBFICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3RTsKKyAgICBpbnQgR0xfT1BFUkFORDBfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTk4OworICAgIGludCBHTF9PUEVSQU5EMF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTA7CisgICAgaW50IEdMX09QRVJBTkQxX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5OTsKKyAgICBpbnQgR0xfT1BFUkFORDFfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTkxOworICAgIGludCBHTF9PUEVSQU5EMl9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OUE7CisgICAgaW50IEdMX09QRVJBTkQyX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5MjsKKyAgICBpbnQgR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT04gICAgICAgICAgICAgID0gMHg4MTI5OworICAgIGludCBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFICAgICAgICAgICAgICAgPSAweDgxMjg7CisgICAgaW50IEdMX1BPSU5UX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIxMTsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9CVUZGRVJfQklORElOR19PRVMgICAgID0gMHg4QjlGOworICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOUM7CisgICAgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICA9IDB4ODk4QzsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9TVFJJREVfT0VTICAgICAgICAgICAgID0gMHg4OThCOworICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICAgICAgPSAweDg5OEE7CisgICAgaW50IEdMX1BPSU5UX1NJWkVfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODEyNzsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MTI2OworICAgIGludCBHTF9QT0lOVF9TUFJJVEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4NjE7CisgICAgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUiAgICAgICAgICAgICAgICAgICA9IDB4ODAzODsKKyAgICBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMgICAgICAgICAgICAgICAgICAgID0gMHgyQTAwOworICAgIGludCBHTF9QUkVWSU9VUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1Nzg7CisgICAgaW50IEdMX1BSSU1BUllfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3NzsKKyAgICBpbnQgR0xfUFJPSkVDVElPTl9NQVRSSVggICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkE3OworICAgIGludCBHTF9QUk9KRUNUSU9OX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgPSAweDg5OEU7CisgICAgaW50IEdMX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggICAgICAgICAgICAgICAgICA9IDB4MEJBNDsKKyAgICBpbnQgR0xfUkdCX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTczOworICAgIGludCBHTF9TQU1QTEVfQlVGRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQTg7CisgICAgaW50IEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQgICAgICAgICAgICAgICAgICA9IDB4ODBBQjsKKyAgICBpbnQgR0xfU0FNUExFX0NPVkVSQUdFX1ZBTFVFICAgICAgICAgICAgICAgICAgID0gMHg4MEFBOworICAgIGludCBHTF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQTk7CisgICAgaW50IEdMX1NDSVNTT1JfQk9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMxMDsKKyAgICBpbnQgR0xfU0hBREVfTU9ERUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjU0OworICAgIGludCBHTF9TUkMwX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODg7CisgICAgaW50IEdMX1NSQzBfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4MDsKKyAgICBpbnQgR0xfU1JDMV9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTg5OworICAgIGludCBHTF9TUkMxX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODE7CisgICAgaW50IEdMX1NSQzJfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4QTsKKyAgICBpbnQgR0xfU1JDMl9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTgyOworICAgIGludCBHTF9TVEFUSUNfRFJBVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4RTQ7CisgICAgaW50IEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MTsKKyAgICBpbnQgR0xfU1RFTkNJTF9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjk0OworICAgIGludCBHTF9TVEVOQ0lMX0ZVTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTI7CisgICAgaW50IEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMICAgICAgICAgICAgICAgICA9IDB4MEI5NTsKKyAgICBpbnQgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MgICAgICAgICAgICAgICAgID0gMHgwQjk2OworICAgIGludCBHTF9TVEVOQ0lMX1JFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTc7CisgICAgaW50IEdMX1NURU5DSUxfVkFMVUVfTUFTSyAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MzsKKyAgICBpbnQgR0xfU1RFTkNJTF9XUklURU1BU0sgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjk4OworICAgIGludCBHTF9TVUJUUkFDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RTc7CisgICAgaW50IEdMX1RFWFRVUkVfQklORElOR18yRCAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA2OTsKKyAgICBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgID0gMHg4ODlBOworICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVIgICAgICAgICAgICAgPSAweDgwOTI7CisgICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRSAgICAgICAgICAgICAgICA9IDB4ODA4ODsKKyAgICBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUgICAgICAgICAgICAgID0gMHg4MDhBOworICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAgPSAweDgwODk7CisgICAgaW50IEdMX1RFWFRVUkVfTUFUUklYICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBODsKKyAgICBpbnQgR0xfVEVYVFVSRV9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTICAgID0gMHg4OThGOworICAgIGludCBHTF9URVhUVVJFX1NUQUNLX0RFUFRIICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTU7CisgICAgaW50IEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICA9IDB4ODg5NjsKKyAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX1BPSU5URVIgICAgICAgICAgICAgICAgICAgID0gMHg4MDhFOworICAgIGludCBHTF9WRVJURVhfQVJSQVlfU0laRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0E7CisgICAgaW50IEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3QzsKKyAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdCOworICAgIGludCBHTF9WSUVXUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTI7CisgICAgaW50IEdMX1dSSVRFX09OTFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhCOTsKKworICAgIHZvaWQgZ2xHZXRQb2ludGVydihpbnQgcG5hbWUsIGphdmEubmlvLkJ1ZmZlcltdIHBhcmFtcyk7CisgICAgdm9pZCBnbEJpbmRCdWZmZXIoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBidWZmZXIKKyAgICApOworCisgICAgdm9pZCBnbEJ1ZmZlckRhdGEoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBzaXplLAorICAgICAgICBqYXZhLm5pby5CdWZmZXIgZGF0YSwKKyAgICAgICAgaW50IHVzYWdlCisgICAgKTsKKworICAgIHZvaWQgZ2xCdWZmZXJTdWJEYXRhKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgICBpbnQgc2l6ZSwKKyAgICAgICAgamF2YS5uaW8uQnVmZmVyIGRhdGEKKyAgICApOworCisgICAgdm9pZCBnbENsaXBQbGFuZWYoCisgICAgICAgIGludCBwbGFuZSwKKyAgICAgICAgZmxvYXRbXSBlcXVhdGlvbiwKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsQ2xpcFBsYW5lZigKKyAgICAgICAgaW50IHBsYW5lLAorICAgICAgICBqYXZhLm5pby5GbG9hdEJ1ZmZlciBlcXVhdGlvbgorICAgICk7CisKKyAgICB2b2lkIGdsQ2xpcFBsYW5leCgKKyAgICAgICAgaW50IHBsYW5lLAorICAgICAgICBpbnRbXSBlcXVhdGlvbiwKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsQ2xpcFBsYW5leCgKKyAgICAgICAgaW50IHBsYW5lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgZXF1YXRpb24KKyAgICApOworCisgICAgdm9pZCBnbENvbG9yNHViKAorICAgICAgICBieXRlIHJlZCwKKyAgICAgICAgYnl0ZSBncmVlbiwKKyAgICAgICAgYnl0ZSBibHVlLAorICAgICAgICBieXRlIGFscGhhCisgICAgKTsKKworICAgIHZvaWQgZ2xDb2xvclBvaW50ZXIoCisgICAgICAgIGludCBzaXplLAorICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsRGVsZXRlQnVmZmVycygKKyAgICAgICAgaW50IG4sCisgICAgICAgIGludFtdIGJ1ZmZlcnMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbERlbGV0ZUJ1ZmZlcnMoCisgICAgICAgIGludCBuLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgYnVmZmVycworICAgICk7CisKKyAgICB2b2lkIGdsRHJhd0VsZW1lbnRzKAorICAgICAgICBpbnQgbW9kZSwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsR2VuQnVmZmVycygKKyAgICAgICAgaW50IG4sCisgICAgICAgIGludFtdIGJ1ZmZlcnMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbEdlbkJ1ZmZlcnMoCisgICAgICAgIGludCBuLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgYnVmZmVycworICAgICk7CisKKyAgICB2b2lkIGdsR2V0Qm9vbGVhbnYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgYm9vbGVhbltdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsR2V0Qm9vbGVhbnYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICB2b2lkIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdigKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIHZvaWQgZ2xHZXRDbGlwUGxhbmVmKAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0W10gZXFuLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xHZXRDbGlwUGxhbmVmKAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkZsb2F0QnVmZmVyIGVxbgorICAgICk7CisKKyAgICB2b2lkIGdsR2V0Q2xpcFBsYW5leCgKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBlcW4sCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbEdldENsaXBQbGFuZXgoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIGVxbgorICAgICk7CisKKyAgICB2b2lkIGdsR2V0Rml4ZWR2KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsR2V0Rml4ZWR2KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgdm9pZCBnbEdldEZsb2F0digKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBmbG9hdFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsR2V0RmxvYXR2KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkZsb2F0QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICB2b2lkIGdsR2V0TGlnaHRmdigKKyAgICAgICAgaW50IGxpZ2h0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xHZXRMaWdodGZ2KAorICAgICAgICBpbnQgbGlnaHQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uRmxvYXRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIHZvaWQgZ2xHZXRMaWdodHh2KAorICAgICAgICBpbnQgbGlnaHQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xHZXRMaWdodHh2KAorICAgICAgICBpbnQgbGlnaHQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICB2b2lkIGdsR2V0TWF0ZXJpYWxmdigKKyAgICAgICAgaW50IGZhY2UsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgZmxvYXRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbEdldE1hdGVyaWFsZnYoCisgICAgICAgIGludCBmYWNlLAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkZsb2F0QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICB2b2lkIGdsR2V0TWF0ZXJpYWx4digKKyAgICAgICAgaW50IGZhY2UsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xHZXRNYXRlcmlhbHh2KAorICAgICAgICBpbnQgZmFjZSwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIHZvaWQgZ2xHZXRUZXhFbnZpdigKKyAgICAgICAgaW50IGVudiwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbEdldFRleEVudml2KAorICAgICAgICBpbnQgZW52LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgdm9pZCBnbEdldFRleEVudnh2KAorICAgICAgICBpbnQgZW52LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsR2V0VGV4RW52eHYoCisgICAgICAgIGludCBlbnYsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyZnYoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgZmxvYXRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbEdldFRleFBhcmFtZXRlcmZ2KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkZsb2F0QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICB2b2lkIGdsR2V0VGV4UGFyYW1ldGVyaXYoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJpdigKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJ4digKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbEdldFRleFBhcmFtZXRlcnh2KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgYm9vbGVhbiBnbElzQnVmZmVyKAorICAgICAgICBpbnQgYnVmZmVyCisgICAgKTsKKworICAgIGJvb2xlYW4gZ2xJc0VuYWJsZWQoCisgICAgICAgIGludCBjYXAKKyAgICApOworCisgICAgYm9vbGVhbiBnbElzVGV4dHVyZSgKKyAgICAgICAgaW50IHRleHR1cmUKKyAgICApOworCisgICAgdm9pZCBnbE5vcm1hbFBvaW50ZXIoCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xQb2ludFBhcmFtZXRlcmYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgZmxvYXQgcGFyYW0KKyAgICApOworCisgICAgdm9pZCBnbFBvaW50UGFyYW1ldGVyZnYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgZmxvYXRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbFBvaW50UGFyYW1ldGVyZnYoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uRmxvYXRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIHZvaWQgZ2xQb2ludFBhcmFtZXRlcngoCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50IHBhcmFtCisgICAgKTsKKworICAgIHZvaWQgZ2xQb2ludFBhcmFtZXRlcnh2KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsUG9pbnRQYXJhbWV0ZXJ4digKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIHZvaWQgZ2xQb2ludFNpemVQb2ludGVyT0VTKAorICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgamF2YS5uaW8uQnVmZmVyIHBvaW50ZXIKKyAgICApOworCisgICAgdm9pZCBnbFRleENvb3JkUG9pbnRlcigKKyAgICAgICAgaW50IHNpemUsCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xUZXhFbnZpKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludCBwYXJhbQorICAgICk7CisKKyAgICB2b2lkIGdsVGV4RW52aXYoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xUZXhFbnZpdigKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIHZvaWQgZ2xUZXhQYXJhbWV0ZXJmdigKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBmbG9hdFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsVGV4UGFyYW1ldGVyZnYoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uRmxvYXRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIHZvaWQgZ2xUZXhQYXJhbWV0ZXJpKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludCBwYXJhbQorICAgICk7CisKKyAgICB2b2lkIGdsVGV4UGFyYW1ldGVyaXYoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xUZXhQYXJhbWV0ZXJpdigKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIHZvaWQgZ2xUZXhQYXJhbWV0ZXJ4digKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbFRleFBhcmFtZXRlcnh2KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgdm9pZCBnbFZlcnRleFBvaW50ZXIoCisgICAgICAgIGludCBzaXplLAorICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKK30KZGlmZiAtLWdpdCBhL29wZW5nbC9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHQuamF2YSBiL29wZW5nbC9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTlhMWFiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOworCitwdWJsaWMgaW50ZXJmYWNlIEdMMTFFeHQgZXh0ZW5kcyBHTCB7CisgICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMgPSAweDhCOUU7CisgICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9PRVMgICAgICAgICAgICAgICAgPSAweDg4NDQ7CisgICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9QT0lOVEVSX09FUyAgICAgICAgPSAweDg4NDk7CisgICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TSVpFX09FUyAgICAgICAgICAgPSAweDg4NDY7CisgICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TVFJJREVfT0VTICAgICAgICAgPSAweDg4NDg7CisgICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9UWVBFX09FUyAgICAgICAgICAgPSAweDg4NDc7CisgICAgaW50IEdMX01BVFJJWF9QQUxFVFRFX09FUyAgICAgICAgICAgICAgICAgICAgPSAweDg4NDA7CisgICAgaW50IEdMX01BWF9QQUxFVFRFX01BVFJJQ0VTX09FUyAgICAgICAgICAgICAgPSAweDg4NDI7CisgICAgaW50IEdMX01BWF9WRVJURVhfVU5JVFNfT0VTICAgICAgICAgICAgICAgICAgPSAweDg2QTQ7CisgICAgaW50IEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUyAgICAgICAgICAgICAgICAgPSAweDhCOUQ7CisgICAgaW50IEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMgICAgICAgPSAweDg4OUU7CisgICAgaW50IEdMX1dFSUdIVF9BUlJBWV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDg2QUQ7CisgICAgaW50IEdMX1dFSUdIVF9BUlJBWV9QT0lOVEVSX09FUyAgICAgICAgICAgICAgPSAweDg2QUM7CisgICAgaW50IEdMX1dFSUdIVF9BUlJBWV9TSVpFX09FUyAgICAgICAgICAgICAgICAgPSAweDg2QUI7CisgICAgaW50IEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfT0VTICAgICAgICAgICAgICAgPSAweDg2QUE7CisgICAgaW50IEdMX1dFSUdIVF9BUlJBWV9UWVBFX09FUyAgICAgICAgICAgICAgICAgPSAweDg2QTk7CisKKyAgICB2b2lkIGdsVGV4UGFyYW1ldGVyZnYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtLCBpbnQgb2Zmc2V0KTsKKworICAgIHZvaWQgZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUygKKyAgICAgICAgaW50IG1hdHJpeHBhbGV0dGVpbmRleAorICAgICk7CisKKyAgICB2b2lkIGdsRHJhd1RleGZPRVMoCisgICAgICAgIGZsb2F0IHgsCisgICAgICAgIGZsb2F0IHksCisgICAgICAgIGZsb2F0IHosCisgICAgICAgIGZsb2F0IHdpZHRoLAorICAgICAgICBmbG9hdCBoZWlnaHQKKyAgICApOworCisgICAgdm9pZCBnbERyYXdUZXhmdk9FUygKKyAgICAgICAgZmxvYXRbXSBjb29yZHMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbERyYXdUZXhmdk9FUygKKyAgICAgICAgamF2YS5uaW8uRmxvYXRCdWZmZXIgY29vcmRzCisgICAgKTsKKworICAgIHZvaWQgZ2xEcmF3VGV4aU9FUygKKyAgICAgICAgaW50IHgsCisgICAgICAgIGludCB5LAorICAgICAgICBpbnQgeiwKKyAgICAgICAgaW50IHdpZHRoLAorICAgICAgICBpbnQgaGVpZ2h0CisgICAgKTsKKworICAgIHZvaWQgZ2xEcmF3VGV4aXZPRVMoCisgICAgICAgIGludFtdIGNvb3JkcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsRHJhd1RleGl2T0VTKAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgY29vcmRzCisgICAgKTsKKworICAgIHZvaWQgZ2xEcmF3VGV4c09FUygKKyAgICAgICAgc2hvcnQgeCwKKyAgICAgICAgc2hvcnQgeSwKKyAgICAgICAgc2hvcnQgeiwKKyAgICAgICAgc2hvcnQgd2lkdGgsCisgICAgICAgIHNob3J0IGhlaWdodAorICAgICk7CisKKyAgICB2b2lkIGdsRHJhd1RleHN2T0VTKAorICAgICAgICBzaG9ydFtdIGNvb3JkcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsRHJhd1RleHN2T0VTKAorICAgICAgICBqYXZhLm5pby5TaG9ydEJ1ZmZlciBjb29yZHMKKyAgICApOworCisgICAgdm9pZCBnbERyYXdUZXh4T0VTKAorICAgICAgICBpbnQgeCwKKyAgICAgICAgaW50IHksCisgICAgICAgIGludCB6LAorICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgIGludCBoZWlnaHQKKyAgICApOworCisgICAgdm9pZCBnbERyYXdUZXh4dk9FUygKKyAgICAgICAgaW50W10gY29vcmRzLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xEcmF3VGV4eHZPRVMoCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBjb29yZHMKKyAgICApOworCisgICAgdm9pZCBnbEVuYWJsZSgKKyAgICAgICAgaW50IGNhcAorICAgICk7CisKKyAgICB2b2lkIGdsRW5hYmxlQ2xpZW50U3RhdGUoCisgICAgICAgIGludCBhcnJheQorICAgICk7CisKKyAgICB2b2lkIGdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTKAorICAgICk7CisKKyAgICB2b2lkIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTKAorICAgICAgICBpbnQgc2l6ZSwKKyAgICAgICAgaW50IHR5cGUsCisgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgIGphdmEubmlvLkJ1ZmZlciBwb2ludGVyCisgICAgKTsKKworICAgIHZvaWQgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMoCisgICAgICAgIGludCBzaXplLAorICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsV2VpZ2h0UG9pbnRlck9FUygKKyAgICAgICAgaW50IHNpemUsCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICBqYXZhLm5pby5CdWZmZXIgcG9pbnRlcgorICAgICk7CisKKyAgICB2b2lkIGdsV2VpZ2h0UG9pbnRlck9FUygKKyAgICAgICAgaW50IHNpemUsCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dGVuc2lvblBhY2suamF2YSBiL29wZW5nbC9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzYzkxZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEKQEAgLTAsMCArMSw0MzQgQEAKKy8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0ZW5zaW9uUGFjay5qYXZhCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOworCitwdWJsaWMgaW50ZXJmYWNlIEdMMTFFeHRlbnNpb25QYWNrIGV4dGVuZHMgR0wgeworICAgIGludCBHTF9CTEVORF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQ0E7CisgICAgaW50IEdMX0JMRU5EX0RTVF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBDODsKKyAgICBpbnQgR0xfQkxFTkRfRVFVQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDA5OworICAgIGludCBHTF9CTEVORF9FUVVBVElPTl9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4M0Q7CisgICAgaW50IEdMX0JMRU5EX0VRVUFUSU9OX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwOTsKKyAgICBpbnQgR0xfQkxFTkRfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MENCOworICAgIGludCBHTF9CTEVORF9TUkNfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQzk7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQwX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFMDsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0UxOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTI7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQzX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFMzsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U0OworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UNV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTU7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ2X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFNjsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDdfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U3OworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTg7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ5X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFOTsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDEwX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VBOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUI7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFQzsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDEzX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VEOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUU7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxNV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFRjsKKyAgICBpbnQgR0xfREVDUl9XUkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTA4OworICAgIGludCBHTF9ERVBUSF9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhEMDA7CisgICAgaW50IEdMX0RFUFRIX0NPTVBPTkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwMjsKKyAgICBpbnQgR0xfREVQVEhfQ09NUE9ORU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MUE1OworICAgIGludCBHTF9ERVBUSF9DT01QT05FTlQyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxQTY7CisgICAgaW50IEdMX0RFUFRIX0NPTVBPTkVOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODFBNzsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRV9PRVMgICAgICAgICAgID0gMHg4Q0QxOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFX09FUyAgICAgICAgICAgPSAweDhDRDA7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFX09FUyA9IDB4OENEMzsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMX09FUyAgICAgICAgID0gMHg4Q0QyOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDQTY7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENENTsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgID0gMHg4Q0Q2OworICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNfT0VTICAgICAgICAgICAgPSAweDhDRDk7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFJBV19CVUZGRVJfT0VTICAgICAgICAgICA9IDB4OENEQjsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9GT1JNQVRTX09FUyAgICAgICAgICAgICAgID0gMHg4Q0RBOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVF9PRVMgICAgPSAweDhDRDc7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfUkVBRF9CVUZGRVJfT0VTICAgICAgICAgICA9IDB4OENEQzsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQwOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRF9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhDREQ7CisgICAgaW50IEdMX0ZVTkNfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwNjsKKyAgICBpbnQgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDBCOworICAgIGludCBHTF9GVU5DX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMEE7CisgICAgaW50IEdMX0lOQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUwNzsKKyAgICBpbnQgR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT05fT0VTICAgICAgICAgICAgICAgID0gMHgwNTA2OworICAgIGludCBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFNfT0VTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDREY7CisgICAgaW50IEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxQzsKKyAgICBpbnQgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEU4OworICAgIGludCBHTF9NSVJST1JFRF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgzNzA7CisgICAgaW50IEdMX05PUk1BTF9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxMTsKKyAgICBpbnQgR0xfUkVGTEVDVElPTl9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTEyOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTM7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENBNzsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDUyOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTQ7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1MTsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0hFSUdIVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQzOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUX09FUyAgICAgICAgICAgICAgICAgPSAweDhENDQ7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MTsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDUwOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhENTU7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9XSURUSF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MjsKKyAgICBpbnQgR0xfUkdCNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDU3OworICAgIGludCBHTF9SR0I1NjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENjI7CisgICAgaW50IEdMX1JHQjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA1MTsKKyAgICBpbnQgR0xfUkdCQTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDU2OworICAgIGludCBHTF9SR0JBOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNTg7CisgICAgaW50IEdMX1NURU5DSUxfQVRUQUNITUVOVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQyMDsKKyAgICBpbnQgR0xfU1RFTkNJTF9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTAxOworICAgIGludCBHTF9TVEVOQ0lMX0lOREVYMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDY7CisgICAgaW50IEdMX1NURU5DSUxfSU5ERVg0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0NzsKKyAgICBpbnQgR0xfU1RFTkNJTF9JTkRFWDhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQ4OworICAgIGludCBHTF9TVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMTsKKyAgICBpbnQgR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE0OworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTM7CisgICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxNjsKKyAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE4OworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ogICAgICAgICAgICAgICAgICAgICAgPSAweDg1MUE7CisgICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxNTsKKyAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE3OworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ogICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTk7CisgICAgaW50IEdMX1RFWFRVUkVfR0VOX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjUwMDsKKyAgICBpbnQgR0xfVEVYVFVSRV9HRU5fU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDYwOworCisgICAgdm9pZCBnbEJpbmRGcmFtZWJ1ZmZlck9FUygKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IGZyYW1lYnVmZmVyCisgICAgKTsKKworICAgIHZvaWQgZ2xCaW5kUmVuZGVyYnVmZmVyT0VTKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcmVuZGVyYnVmZmVyCisgICAgKTsKKworICAgIHZvaWQgZ2xCaW5kVGV4dHVyZSgKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHRleHR1cmUKKyAgICApOworCisgICAgdm9pZCBnbEJsZW5kRXF1YXRpb24oCisgICAgICAgIGludCBtb2RlCisgICAgKTsKKworICAgIHZvaWQgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUoCisgICAgICAgIGludCBtb2RlUkdCLAorICAgICAgICBpbnQgbW9kZUFscGhhCisgICAgKTsKKworICAgIHZvaWQgZ2xCbGVuZEZ1bmNTZXBhcmF0ZSgKKyAgICAgICAgaW50IHNyY1JHQiwKKyAgICAgICAgaW50IGRzdFJHQiwKKyAgICAgICAgaW50IHNyY0FscGhhLAorICAgICAgICBpbnQgZHN0QWxwaGEKKyAgICApOworCisgICAgaW50IGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUygKKyAgICAgICAgaW50IHRhcmdldAorICAgICk7CisKKyAgICB2b2lkIGdsQ29tcHJlc3NlZFRleEltYWdlMkQoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBsZXZlbCwKKyAgICAgICAgaW50IGludGVybmFsZm9ybWF0LAorICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgIGludCBib3JkZXIsCisgICAgICAgIGludCBpbWFnZVNpemUsCisgICAgICAgIGphdmEubmlvLkJ1ZmZlciBkYXRhCisgICAgKTsKKworICAgIHZvaWQgZ2xDb3B5VGV4SW1hZ2UyRCgKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IGxldmVsLAorICAgICAgICBpbnQgaW50ZXJuYWxmb3JtYXQsCisgICAgICAgIGludCB4LAorICAgICAgICBpbnQgeSwKKyAgICAgICAgaW50IHdpZHRoLAorICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICBpbnQgYm9yZGVyCisgICAgKTsKKworICAgIHZvaWQgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMoCisgICAgICAgIGludCBuLAorICAgICAgICBpbnRbXSBmcmFtZWJ1ZmZlcnMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbERlbGV0ZUZyYW1lYnVmZmVyc09FUygKKyAgICAgICAgaW50IG4sCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBmcmFtZWJ1ZmZlcnMKKyAgICApOworCisgICAgdm9pZCBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMoCisgICAgICAgIGludCBuLAorICAgICAgICBpbnRbXSByZW5kZXJidWZmZXJzLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTKAorICAgICAgICBpbnQgbiwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHJlbmRlcmJ1ZmZlcnMKKyAgICApOworCisgICAgdm9pZCBnbEVuYWJsZSgKKyAgICAgICAgaW50IGNhcAorICAgICk7CisKKyAgICB2b2lkIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBhdHRhY2htZW50LAorICAgICAgICBpbnQgcmVuZGVyYnVmZmVydGFyZ2V0LAorICAgICAgICBpbnQgcmVuZGVyYnVmZmVyCisgICAgKTsKKworICAgIHZvaWQgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUygKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IGF0dGFjaG1lbnQsCisgICAgICAgIGludCB0ZXh0YXJnZXQsCisgICAgICAgIGludCB0ZXh0dXJlLAorICAgICAgICBpbnQgbGV2ZWwKKyAgICApOworCisgICAgdm9pZCBnbEdlbmVyYXRlTWlwbWFwT0VTKAorICAgICAgICBpbnQgdGFyZ2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMoCisgICAgICAgIGludCBuLAorICAgICAgICBpbnRbXSBmcmFtZWJ1ZmZlcnMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbEdlbkZyYW1lYnVmZmVyc09FUygKKyAgICAgICAgaW50IG4sCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBmcmFtZWJ1ZmZlcnMKKyAgICApOworCisgICAgdm9pZCBnbEdlblJlbmRlcmJ1ZmZlcnNPRVMoCisgICAgICAgIGludCBuLAorICAgICAgICBpbnRbXSByZW5kZXJidWZmZXJzLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xHZW5SZW5kZXJidWZmZXJzT0VTKAorICAgICAgICBpbnQgbiwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHJlbmRlcmJ1ZmZlcnMKKyAgICApOworCisgICAgdm9pZCBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgYXR0YWNobWVudCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgYXR0YWNobWVudCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5JbnRCdWZmZXIgcGFyYW1zCisgICAgKTsKKworICAgIHZvaWQgZ2xHZXRJbnRlZ2VydigKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbEdldEludGVnZXJ2KAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgdm9pZCBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTKAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICB2b2lkIGdsR2V0VGV4R2VuZnYoCisgICAgICAgIGludCBjb29yZCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBmbG9hdFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsR2V0VGV4R2VuZnYoCisgICAgICAgIGludCBjb29yZCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBqYXZhLm5pby5GbG9hdEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgdm9pZCBnbEdldFRleEdlbml2KAorICAgICAgICBpbnQgY29vcmQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xHZXRUZXhHZW5pdigKKyAgICAgICAgaW50IGNvb3JkLAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgdm9pZCBnbEdldFRleEdlbnh2KAorICAgICAgICBpbnQgY29vcmQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgaW50W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xHZXRUZXhHZW54digKKyAgICAgICAgaW50IGNvb3JkLAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkludEJ1ZmZlciBwYXJhbXMKKyAgICApOworCisgICAgYm9vbGVhbiBnbElzRnJhbWVidWZmZXJPRVMoCisgICAgICAgIGludCBmcmFtZWJ1ZmZlcgorICAgICk7CisKKyAgICBib29sZWFuIGdsSXNSZW5kZXJidWZmZXJPRVMoCisgICAgICAgIGludCByZW5kZXJidWZmZXIKKyAgICApOworCisgICAgdm9pZCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgaW50IHdpZHRoLAorICAgICAgICBpbnQgaGVpZ2h0CisgICAgKTsKKworICAgIHZvaWQgZ2xTdGVuY2lsT3AoCisgICAgICAgIGludCBmYWlsLAorICAgICAgICBpbnQgemZhaWwsCisgICAgICAgIGludCB6cGFzcworICAgICk7CisKKyAgICB2b2lkIGdsVGV4RW52ZigKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBmbG9hdCBwYXJhbQorICAgICk7CisKKyAgICB2b2lkIGdsVGV4RW52ZnYoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgZmxvYXRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbFRleEVudmZ2KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkZsb2F0QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICB2b2lkIGdsVGV4RW52eCgKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnQgcGFyYW0KKyAgICApOworCisgICAgdm9pZCBnbFRleEVudnh2KAorICAgICAgICBpbnQgdGFyZ2V0LAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludFtdIHBhcmFtcywKKyAgICAgICAgaW50IG9mZnNldAorICAgICk7CisKKyAgICB2b2lkIGdsVGV4RW52eHYoCisgICAgICAgIGludCB0YXJnZXQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICB2b2lkIGdsVGV4R2VuZigKKyAgICAgICAgaW50IGNvb3JkLAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0IHBhcmFtCisgICAgKTsKKworICAgIHZvaWQgZ2xUZXhHZW5mdigKKyAgICAgICAgaW50IGNvb3JkLAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGZsb2F0W10gcGFyYW1zLAorICAgICAgICBpbnQgb2Zmc2V0CisgICAgKTsKKworICAgIHZvaWQgZ2xUZXhHZW5mdigKKyAgICAgICAgaW50IGNvb3JkLAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGphdmEubmlvLkZsb2F0QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICB2b2lkIGdsVGV4R2VuaSgKKyAgICAgICAgaW50IGNvb3JkLAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludCBwYXJhbQorICAgICk7CisKKyAgICB2b2lkIGdsVGV4R2VuaXYoCisgICAgICAgIGludCBjb29yZCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbFRleEdlbml2KAorICAgICAgICBpbnQgY29vcmQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICB2b2lkIGdsVGV4R2VueCgKKyAgICAgICAgaW50IGNvb3JkLAorICAgICAgICBpbnQgcG5hbWUsCisgICAgICAgIGludCBwYXJhbQorICAgICk7CisKKyAgICB2b2lkIGdsVGV4R2VueHYoCisgICAgICAgIGludCBjb29yZCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBpbnRbXSBwYXJhbXMsCisgICAgICAgIGludCBvZmZzZXQKKyAgICApOworCisgICAgdm9pZCBnbFRleEdlbnh2KAorICAgICAgICBpbnQgY29vcmQsCisgICAgICAgIGludCBwbmFtZSwKKyAgICAgICAgamF2YS5uaW8uSW50QnVmZmVyIHBhcmFtcworICAgICk7CisKKyAgICB2b2lkIGdsVGV4UGFyYW1ldGVyZigKKyAgICAgICAgaW50IHRhcmdldCwKKyAgICAgICAgaW50IHBuYW1lLAorICAgICAgICBmbG9hdCBwYXJhbQorICAgICk7CisKK30KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvQW5kcm9pZC5tayBiL29wZW5nbC9saWJhZ2wvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWVmZTRjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzkgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjCisjIEJ1aWxkIHRoZSBzb2Z0d2FyZSBPcGVuR0wgRVMgbGlicmFyeQorIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCWVnbC5jcHAgICAgICAgICAgICAgICAgICAgICBcCisJc3RhdGUuY3BwCQkgICAgICAgICAgICBcCisJdGV4dHVyZS5jcHAJCSAgICAgICAgICAgIFwKKyAgICBUb2tlbml6ZXIuY3BwICAgICAgICAgICAgICAgXAorICAgIFRva2VuTWFuYWdlci5jcHAgICAgICAgICAgICBcCisgICAgVGV4dHVyZU9iamVjdE1hbmFnZXIuY3BwICAgIFwKKyAgICBCdWZmZXJPYmplY3RNYW5hZ2VyLmNwcCAgICAgXAorCWFycmF5LmNwcC5hcm0JCSAgICAgICAgXAorCWZwLmNwcC5hcm0JCSAgICAgICAgICAgIFwKKwlsaWdodC5jcHAuYXJtCQkgICAgICAgIFwKKwltYXRyaXguY3BwLmFybQkJICAgICAgICBcCisJbWlwbWFwLmNwcC5hcm0JCSAgICAgICAgXAorCXByaW1pdGl2ZXMuY3BwLmFybQkgICAgICAgIFwKKwl2ZXJ0ZXguY3BwLmFybQorCitpZmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCisJTE9DQUxfU1JDX0ZJTEVTICs9IGZpeGVkX2FzbS5TIGl0ZXJhdG9ycy5TCisJTE9DQUxfQ0ZMQUdTICs9IC1mc3RyaWN0LWFsaWFzaW5nCitlbmRpZgorCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorICAgICMgd2UgbmVlZCB0byBhY2Nlc3MgdGhlIHByaXZhdGUgQmlvbmljIGhlYWRlciA8YmlvbmljX3Rscy5oPgorICAgIExPQ0FMX0NGTEFHUyArPSAtSSQoTE9DQUxfUEFUSCkvLi4vLi4vLi4vLi4vYmlvbmljL2xpYmMvcHJpdmF0ZQorZW5kaWYKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGlidXRpbHMgbGlicGl4ZWxmbGluZ2VyCitMT0NBTF9MRExJQlMgOj0gLWxwdGhyZWFkIC1sZGwKK0xPQ0FMX01PRFVMRTo9IGxpYmFnbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL0J1ZmZlck9iamVjdE1hbmFnZXIuY3BwIGIvb3BlbmdsL2xpYmFnbC9CdWZmZXJPYmplY3RNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmYyOGVlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9CdWZmZXJPYmplY3RNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoqCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqKgorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvQXRvbWljLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKyNpbmNsdWRlICJCdWZmZXJPYmplY3RNYW5hZ2VyLmgiCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBuYW1lc3BhY2UgZ2w7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRUdMQnVmZmVyT2JqZWN0TWFuYWdlcjo6RUdMQnVmZmVyT2JqZWN0TWFuYWdlcigpIAorOiBUb2tlbk1hbmFnZXIoKSwgbUNvdW50KDApCit7Cit9CisKK0VHTEJ1ZmZlck9iamVjdE1hbmFnZXI6On5FR0xCdWZmZXJPYmplY3RNYW5hZ2VyKCkKK3sKKyAgICAvLyBkZXN0cm95IGFsbCB0aGUgYnVmZmVyIG9iamVjdHMgYW5kIHRoZWlyIHN0b3JhZ2UKKyAgICBHTHNpemVpIG4gPSBtQnVmZmVycy5zaXplKCk7CisgICAgZm9yIChHTHNpemVpIGk9MCA7IGk8biA7IGkrKykgeworICAgICAgICBidWZmZXJfdCogYm8gPSBtQnVmZmVycy52YWx1ZUF0KGkpOworICAgICAgICBmcmVlKGJvLT5kYXRhKTsKKyAgICAgICAgZGVsZXRlIGJvOworICAgIH0KK30KKworYnVmZmVyX3QgY29uc3QqIEVHTEJ1ZmZlck9iamVjdE1hbmFnZXI6OmJpbmQoR0x1aW50IGJ1ZmZlcikKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGludDMyX3QgaSA9IG1CdWZmZXJzLmluZGV4T2ZLZXkoYnVmZmVyKTsKKyAgICBpZiAoaSA+PSAwKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVycy52YWx1ZUF0KGkpOworICAgIH0KKyAgICBidWZmZXJfdCogYm8gPSBuZXcgYnVmZmVyX3Q7CisgICAgYm8tPmRhdGEgPSAwOworICAgIGJvLT51c2FnZSA9IEdMX1NUQVRJQ19EUkFXOworICAgIGJvLT5zaXplID0gMDsKKyAgICBiby0+bmFtZSA9IGJ1ZmZlcjsKKyAgICBtQnVmZmVycy5hZGQoYnVmZmVyLCBibyk7CisgICAgcmV0dXJuIGJvOworfQorCitpbnQgRUdMQnVmZmVyT2JqZWN0TWFuYWdlcjo6YWxsb2NhdGVTdG9yZShidWZmZXJfdCogYm8sCisgICAgICAgIEdMc2l6ZWlwdHIgc2l6ZSwgR0xlbnVtIHVzYWdlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKHNpemUgIT0gYm8tPnNpemUpIHsKKyAgICAgICB1aW50OF90KiBkYXRhID0gKHVpbnQ4X3QqKW1hbGxvYyhzaXplKTsKKyAgICAgICAgaWYgKGRhdGEgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZnJlZShiby0+ZGF0YSk7CisgICAgICAgIGJvLT5kYXRhID0gZGF0YTsKKyAgICAgICAgYm8tPnNpemUgPSBzaXplOworICAgIH0KKyAgICBiby0+dXNhZ2UgPSB1c2FnZTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBFR0xCdWZmZXJPYmplY3RNYW5hZ2VyOjpkZWxldGVCdWZmZXJzKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBidWZmZXJzKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgd2hpbGUgKG4tLSkgeworICAgICAgICBjb25zdCBHTHVpbnQgdCA9ICpidWZmZXJzKys7CisgICAgICAgIGlmICh0KSB7CisgICAgICAgICAgICBpbnQzMl90IGluZGV4ID0gbUJ1ZmZlcnMuaW5kZXhPZktleSh0KTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyX3QqIGJvID0gbUJ1ZmZlcnMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICAgICAgZnJlZShiby0+ZGF0YSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgICAgICAgICAgZGVsZXRlIGJvOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9CdWZmZXJPYmplY3RNYW5hZ2VyLmggYi9vcGVuZ2wvbGliYWdsL0J1ZmZlck9iamVjdE1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTkzNDBhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9CdWZmZXJPYmplY3RNYW5hZ2VyLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqKgorICoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICoqCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfQlVGRkVSX09CSkVDVF9NQU5BR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19CVUZGRVJfT0JKRUNUX01BTkFHRVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworI2luY2x1ZGUgIlRva2VuaXplci5oIgorI2luY2x1ZGUgIlRva2VuTWFuYWdlci5oIgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgZ2wgeworCitzdHJ1Y3QgYnVmZmVyX3QgeworICAgIEdMc2l6ZWlwdHIgICAgICBzaXplOworICAgIEdMZW51bSAgICAgICAgICB1c2FnZTsKKyAgICB1aW50OF90KiAgICAgICAgZGF0YTsKKyAgICB1aW50MzJfdCAgICAgICAgbmFtZTsKK307CisKK307CisKK2NsYXNzIEVHTEJ1ZmZlck9iamVjdE1hbmFnZXIgOiBwdWJsaWMgVG9rZW5NYW5hZ2VyCit7CitwdWJsaWM6CisgICAgRUdMQnVmZmVyT2JqZWN0TWFuYWdlcigpOworICAgIH5FR0xCdWZmZXJPYmplY3RNYW5hZ2VyKCk7CisKKyAgICAvLyBwcm90b2NvbCBmb3Igc3A8PgorICAgIGlubGluZSAgdm9pZCAgICBpbmNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0OworICAgIGlubGluZSAgdm9pZCAgICBkZWNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0OworICAgIHR5cGVkZWYgdm9pZCAgICB3ZWFrcmVmX3R5cGU7CisKKyAgICBnbDo6YnVmZmVyX3QgY29uc3QqIGJpbmQoR0x1aW50IGJ1ZmZlcik7CisgICAgaW50ICAgICAgICAgICAgICAgICBhbGxvY2F0ZVN0b3JlKGdsOjpidWZmZXJfdCogYm8sIEdMc2l6ZWlwdHIgc2l6ZSwgR0xlbnVtIHVzYWdlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIGRlbGV0ZUJ1ZmZlcnMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGJ1ZmZlcnMpOworCitwcml2YXRlOgorICAgIG11dGFibGUgdm9sYXRpbGUgaW50MzJfdCAgICAgICAgICAgIG1Db3VudDsKKyAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKKyAgICBLZXllZFZlY3RvcjxHTHVpbnQsIGdsOjpidWZmZXJfdCo+ICBtQnVmZmVyczsKK307CisKK3ZvaWQgRUdMQnVmZmVyT2JqZWN0TWFuYWdlcjo6aW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdCB7CisgICAgYW5kcm9pZF9hdG9taWNfaW5jKCZtQ291bnQpOworfQordm9pZCBFR0xCdWZmZXJPYmplY3RNYW5hZ2VyOjpkZWNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0IHsKKyAgICBpZiAoYW5kcm9pZF9hdG9taWNfZGVjKCZtQ291bnQpID09IDEpIHsKKyAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9PUEVOR0xFU19CVUZGRVJfT0JKRUNUX01BTkFHRVJfSAorCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL1RleHR1cmVPYmplY3RNYW5hZ2VyLmNwcCBiL29wZW5nbC9saWJhZ2wvVGV4dHVyZU9iamVjdE1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMzE4NTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL1RleHR1cmVPYmplY3RNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoqCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqKgorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiY29udGV4dC5oIgorI2luY2x1ZGUgIlRleHR1cmVPYmplY3RNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRUdMVGV4dHVyZU9iamVjdDo6RUdMVGV4dHVyZU9iamVjdCgpCisgICAgOiBtQ291bnQoMCksIG1TaXplKDApCit7CisgICAgaW5pdCgpOworfQorCitFR0xUZXh0dXJlT2JqZWN0Ojp+RUdMVGV4dHVyZU9iamVjdCgpCit7CisgICAgaWYgKCFkaXJlY3QpIHsKKyAgICAgICAgaWYgKG1TaXplICYmIHN1cmZhY2UuZGF0YSkKKyAgICAgICAgICAgIGZyZWUoc3VyZmFjZS5kYXRhKTsKKyAgICAgICAgaWYgKG1NaXBtYXBzKQorICAgICAgICAgICAgZnJlZU1pcG1hcHMoKTsKKyAgICB9Cit9CisKK3ZvaWQgRUdMVGV4dHVyZU9iamVjdDo6aW5pdCgpCit7CisgICAgbWVtc2V0KCZzdXJmYWNlLCAwLCBzaXplb2Yoc3VyZmFjZSkpOworICAgIHN1cmZhY2UudmVyc2lvbiA9IHNpemVvZihzdXJmYWNlKTsKKyAgICBtTWlwbWFwcyA9IDA7CisgICAgbU51bUV4dHJhTG9kID0gMDsKKyAgICBtSXNDb21wbGV0ZSA9IGZhbHNlOworICAgIHdyYXBzID0gR0xfUkVQRUFUOworICAgIHdyYXB0ID0gR0xfUkVQRUFUOworICAgIG1pbl9maWx0ZXIgPSBHTF9MSU5FQVI7CisgICAgbWFnX2ZpbHRlciA9IEdMX0xJTkVBUjsKKyAgICBpbnRlcm5hbGZvcm1hdCA9IDA7CisgICAgbWVtc2V0KGNyb3BfcmVjdCwgMCwgc2l6ZW9mKGNyb3BfcmVjdCkpOworICAgIGdlbmVyYXRlX21pcG1hcCA9IEdMX0ZBTFNFOworICAgIGRpcmVjdCA9IEdMX0ZBTFNFOworfQorCit2b2lkIEVHTFRleHR1cmVPYmplY3Q6OmNvcHlQYXJhbWV0ZXJzKGNvbnN0IHNwPEVHTFRleHR1cmVPYmplY3Q+JiBvbGQpCit7CisgICAgd3JhcHMgPSBvbGQtPndyYXBzOworICAgIHdyYXB0ID0gb2xkLT53cmFwdDsKKyAgICBtaW5fZmlsdGVyID0gb2xkLT5taW5fZmlsdGVyOworICAgIG1hZ19maWx0ZXIgPSBvbGQtPm1hZ19maWx0ZXI7CisgICAgbWVtY3B5KGNyb3BfcmVjdCwgb2xkLT5jcm9wX3JlY3QsIHNpemVvZihjcm9wX3JlY3QpKTsKKyAgICBnZW5lcmF0ZV9taXBtYXAgPSBvbGQtPmdlbmVyYXRlX21pcG1hcDsKKyAgICBkaXJlY3QgPSBvbGQtPmRpcmVjdDsKK30KKworc3RhdHVzX3QgRUdMVGV4dHVyZU9iamVjdDo6YWxsb2NhdGVNaXBtYXBzKCkKK3sKKyAgICAvLyBoZXJlLCBieSBjb25zdHJ1Y3Rpb24sIG1NaXBtYXBzPTAgJiYgbU51bUV4dHJhTG9kPTAKKworICAgIGlmICghc3VyZmFjZS5kYXRhKQorICAgICAgICByZXR1cm4gTk9fSU5JVDsKKworICAgIGludCB3ID0gc3VyZmFjZS53aWR0aDsKKyAgICBpbnQgaCA9IHN1cmZhY2UuaGVpZ2h0OworICAgIGNvbnN0IGludCBudW1Mb2RzID0gMzEgLSBnZ2xDbHoobWF4KHcsaCkpOworICAgIGlmIChudW1Mb2RzIDw9IDApCisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKworICAgIG1NaXBtYXBzID0gKEdHTFN1cmZhY2UqKW1hbGxvYyhudW1Mb2RzICogc2l6ZW9mKEdHTFN1cmZhY2UpKTsKKyAgICBpZiAoIW1NaXBtYXBzKQorICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworCisgICAgbWVtc2V0KG1NaXBtYXBzLCAwLCBudW1Mb2RzICogc2l6ZW9mKEdHTFN1cmZhY2UpKTsKKyAgICBtTnVtRXh0cmFMb2QgPSBudW1Mb2RzOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBFR0xUZXh0dXJlT2JqZWN0OjpmcmVlTWlwbWFwcygpCit7CisgICAgaWYgKG1NaXBtYXBzKSB7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8bU51bUV4dHJhTG9kIDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobU1pcG1hcHNbaV0uZGF0YSkgeworICAgICAgICAgICAgICAgIGZyZWUobU1pcG1hcHNbaV0uZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJlZShtTWlwbWFwcyk7CisgICAgICAgIG1NaXBtYXBzID0gMDsKKyAgICAgICAgbU51bUV4dHJhTG9kID0gMDsKKyAgICB9Cit9CisKK2NvbnN0IEdHTFN1cmZhY2UmIEVHTFRleHR1cmVPYmplY3Q6Om1pcChpbnQgbG9kKSBjb25zdAoreworICAgIGlmIChsb2Q8PTAgfHwgIW1NaXBtYXBzKQorICAgICAgICByZXR1cm4gc3VyZmFjZTsKKyAgICBsb2QgPSBtaW4obG9kLTEsIG1OdW1FeHRyYUxvZC0xKTsKKyAgICByZXR1cm4gbU1pcG1hcHNbbG9kXTsKK30KKworR0dMU3VyZmFjZSYgRUdMVGV4dHVyZU9iamVjdDo6ZWRpdE1pcChpbnQgbG9kKQoreworICAgIHJldHVybiBjb25zdF9jYXN0PEdHTFN1cmZhY2UmPihtaXAobG9kKSk7Cit9CisKK3N0YXR1c190IEVHTFRleHR1cmVPYmplY3Q6OnNldFN1cmZhY2UoR0dMU3VyZmFjZSBjb25zdCogcykKK3sKKyAgICAvLyBYWFg6IGdsRmx1c2goKSBvbiAncycKKyAgICBpZiAobVNpemUgJiYgc3VyZmFjZS5kYXRhKSB7CisgICAgICAgIGZyZWUoc3VyZmFjZS5kYXRhKTsKKyAgICB9CisgICAgc3VyZmFjZSA9ICpzOworICAgIGludGVybmFsZm9ybWF0ID0gMDsKKworICAgIC8vIHdlIHNob3VsZCBrZWVwIHRoZSBjcm9wX3JlY3QsIGJ1dCBpdCdzIGRlbGljYXRlIGJlY2F1c2UKKyAgICAvLyB0aGUgbmV3IHNpemUgb2YgdGhlIHN1cmZhY2UgY291bGQgbWFrZSBpdCBpbnZhbGlkLgorICAgIC8vIHNvIGZvciBub3csIHdlIGp1c3QgbG9vc2UgaXQuCisgICAgbWVtc2V0KGNyb3BfcmVjdCwgMCwgc2l6ZW9mKGNyb3BfcmVjdCkpOworCisgICAgLy8gaXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBrZWVwIHRoZSBnZW5lcmF0ZV9taXBtYXAgZmxhZywKKyAgICAvLyB3ZSB3b3VsZCBoYXZlIHRvIGdlbmVyYXRlIHRoZW0gcmlnaHQgbm93IHRob3VnaC4KKyAgICBnZW5lcmF0ZV9taXBtYXAgPSBHTF9GQUxTRTsKKworICAgIGRpcmVjdCA9IEdMX1RSVUU7CisgICAgbVNpemUgPSAwOyAgLy8gd2UgZG9uJ3Qgb3duIHRoaXMgc3VyZmFjZQorICAgIGlmIChtTWlwbWFwcykKKyAgICAgICAgZnJlZU1pcG1hcHMoKTsKKyAgICBtSXNDb21wbGV0ZSA9IHRydWU7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFR0xUZXh0dXJlT2JqZWN0OjpyZWFsbG9jYXRlKAorICAgICAgICBHTGludCBsZXZlbCwgaW50IHcsIGludCBoLCBpbnQgcywKKyAgICAgICAgaW50IGZvcm1hdCwgaW50IGNvbXByZXNzZWRGb3JtYXQsIGludCBicHIpCit7CisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBoICogYnByOworICAgIGlmIChsZXZlbCA9PSAwKSAKKyAgICB7CisgICAgICAgIGlmIChzaXplIT1tU2l6ZSB8fCAhc3VyZmFjZS5kYXRhKSB7CisgICAgICAgICAgICBpZiAobVNpemUgJiYgc3VyZmFjZS5kYXRhKSB7CisgICAgICAgICAgICAgICAgZnJlZShzdXJmYWNlLmRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VyZmFjZS5kYXRhID0gKEdHTHVieXRlKiltYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICBpZiAoIXN1cmZhY2UuZGF0YSkgeworICAgICAgICAgICAgICAgIG1TaXplID0gMDsKKyAgICAgICAgICAgICAgICBtSXNDb21wbGV0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2l6ZSA9IHNpemU7CisgICAgICAgIH0KKyAgICAgICAgc3VyZmFjZS52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOworICAgICAgICBzdXJmYWNlLndpZHRoICA9IHc7CisgICAgICAgIHN1cmZhY2UuaGVpZ2h0ID0gaDsKKyAgICAgICAgc3VyZmFjZS5zdHJpZGUgPSBzOworICAgICAgICBzdXJmYWNlLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgc3VyZmFjZS5jb21wcmVzc2VkRm9ybWF0ID0gY29tcHJlc3NlZEZvcm1hdDsKKyAgICAgICAgaWYgKG1NaXBtYXBzKQorICAgICAgICAgICAgZnJlZU1pcG1hcHMoKTsKKyAgICAgICAgbUlzQ29tcGxldGUgPSB0cnVlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoIW1NaXBtYXBzKSB7CisgICAgICAgICAgICBpZiAoYWxsb2NhdGVNaXBtYXBzKCkgIT0gTk9fRVJST1IpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorCisgICAgICAgIExPR1dfSUYobGV2ZWwtMSA+PSBtTnVtRXh0cmFMb2QsIAorICAgICAgICAgICAgICAgICJzcGVjaWZ5aW5nIG1pcG1hcCBsZXZlbCAlZCwgYnV0ICMgb2YgbGV2ZWwgaXMgJWQiLAorICAgICAgICAgICAgICAgIGxldmVsLCBtTnVtRXh0cmFMb2QrMSk7ICAgICAgICAKKworICAgICAgICBHR0xTdXJmYWNlJiBtaXBtYXAgPSBlZGl0TWlwKGxldmVsKTsKKyAgICAgICAgaWYgKG1pcG1hcC5kYXRhKQorICAgICAgICAgICAgZnJlZShtaXBtYXAuZGF0YSk7CisKKyAgICAgICAgbWlwbWFwLmRhdGEgPSAoR0dMdWJ5dGUqKW1hbGxvYyhzaXplKTsKKyAgICAgICAgaWYgKCFtaXBtYXAuZGF0YSkgeworICAgICAgICAgICAgbWVtc2V0KCZtaXBtYXAsIDAsIHNpemVvZihHR0xTdXJmYWNlKSk7CisgICAgICAgICAgICBtSXNDb21wbGV0ZSA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorCisgICAgICAgIG1pcG1hcC52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOworICAgICAgICBtaXBtYXAud2lkdGggID0gdzsKKyAgICAgICAgbWlwbWFwLmhlaWdodCA9IGg7CisgICAgICAgIG1pcG1hcC5zdHJpZGUgPSBzOworICAgICAgICBtaXBtYXAuZm9ybWF0ID0gZm9ybWF0OworICAgICAgICBtaXBtYXAuY29tcHJlc3NlZEZvcm1hdCA9IGNvbXByZXNzZWRGb3JtYXQ7CisKKyAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHRleHR1cmUgaXMgY29tcGxldGUKKyAgICAgICAgbUlzQ29tcGxldGUgPSB0cnVlOworICAgICAgICBjb25zdCBHR0xTdXJmYWNlKiBwcmV2ID0gJnN1cmZhY2U7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8bU51bUV4dHJhTG9kIDsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBHR0xTdXJmYWNlKiBjdXJyID0gbU1pcG1hcHMgKyBpOworICAgICAgICAgICAgaWYgKGN1cnItPmZvcm1hdCAhPSBzdXJmYWNlLmZvcm1hdCkgeworICAgICAgICAgICAgICAgIG1Jc0NvbXBsZXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IHcgPSAocHJldi0+d2lkdGggID4+IDEpID8gOiAxOworICAgICAgICAgICAgdWludDMyX3QgaCA9IChwcmV2LT5oZWlnaHQgPj4gMSkgPyA6IDE7CisgICAgICAgICAgICBpZiAodyAhPSBjdXJyLT53aWR0aCB8fCBoICE9IGN1cnItPmhlaWdodCkgeworICAgICAgICAgICAgICAgIG1Jc0NvbXBsZXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2ID0gY3VycjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRUdMU3VyZmFjZU1hbmFnZXI6OkVHTFN1cmZhY2VNYW5hZ2VyKCkKKyAgICA6IFRva2VuTWFuYWdlcigpLCBtQ291bnQoMCkKK3sKK30KKworRUdMU3VyZmFjZU1hbmFnZXI6On5FR0xTdXJmYWNlTWFuYWdlcigpCit7CisgICAgLy8gZXZlcnl0aGluZyBnZXRzIGZyZWVkIGF1dG9tYXRpY2FsbHkgaGVyZS4uLgorfQorCitzcDxFR0xUZXh0dXJlT2JqZWN0PiBFR0xTdXJmYWNlTWFuYWdlcjo6Y3JlYXRlVGV4dHVyZShHTHVpbnQgbmFtZSkKK3sKKyAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiByZXN1bHQ7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtVGV4dHVyZXMuaW5kZXhPZktleShuYW1lKSA+PSAwKQorICAgICAgICByZXR1cm4gcmVzdWx0OyAvLyBhbHJlYWR5IGV4aXN0cyEKKworICAgIHJlc3VsdCA9IG5ldyBFR0xUZXh0dXJlT2JqZWN0KCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtVGV4dHVyZXMuYWRkKG5hbWUsIHJlc3VsdCk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJlc3VsdC5jbGVhcigpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3A8RUdMVGV4dHVyZU9iamVjdD4gRUdMU3VyZmFjZU1hbmFnZXI6OnJlbW92ZVRleHR1cmUoR0x1aW50IG5hbWUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbVRleHR1cmVzLmluZGV4T2ZLZXkobmFtZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8RUdMVGV4dHVyZU9iamVjdD4gcmVzdWx0KG1UZXh0dXJlcy52YWx1ZUF0KGluZGV4KSk7CisgICAgICAgIG1UZXh0dXJlcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3NwPEVHTFRleHR1cmVPYmplY3Q+IEVHTFN1cmZhY2VNYW5hZ2VyOjpyZXBsYWNlVGV4dHVyZShHTHVpbnQgbmFtZSkKK3sKKyAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiB0ZXg7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbVRleHR1cmVzLmluZGV4T2ZLZXkobmFtZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgY29uc3Qgc3A8RUdMVGV4dHVyZU9iamVjdD4mIG9sZCA9IG1UZXh0dXJlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgcmVmcyA9IG9sZC0+Z2V0U3Ryb25nQ291bnQoKTsKKyAgICAgICAgaWYgKGdnbF9saWtlbHkocmVmcyA9PSAxKSkgeworICAgICAgICAgICAgLy8gd2UncmUgdGhlIG9ubHkgb3duZXIKKyAgICAgICAgICAgIHRleCA9IG9sZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGtlZXAgdGhlIHRleHR1cmUncyBwYXJhbWV0ZXJzCisgICAgICAgICAgICB0ZXggPSBuZXcgRUdMVGV4dHVyZU9iamVjdCgpOworICAgICAgICAgICAgdGV4LT5jb3B5UGFyYW1ldGVycyhvbGQpOworICAgICAgICAgICAgbVRleHR1cmVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICAgICAgbVRleHR1cmVzLmFkZChuYW1lLCB0ZXgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0ZXg7Cit9CisKK3ZvaWQgRUdMU3VyZmFjZU1hbmFnZXI6OmRlbGV0ZVRleHR1cmVzKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0b2tlbnMpCit7CisgICAgLy8gZnJlZSBhbGwgdGV4dHVyZXMKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoR0xzaXplaSBpPTAgOyBpPG4gOyBpKyspIHsKKyAgICAgICAgY29uc3QgR0x1aW50IHQoKnRva2VucysrKTsKKyAgICAgICAgaWYgKHQpIHsKKyAgICAgICAgICAgIG1UZXh0dXJlcy5yZW1vdmVJdGVtKHQpOworICAgICAgICB9CisgICAgfQorfQorCitzcDxFR0xUZXh0dXJlT2JqZWN0PiBFR0xTdXJmYWNlTWFuYWdlcjo6dGV4dHVyZShHTHVpbnQgbmFtZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtVGV4dHVyZXMuaW5kZXhPZktleShuYW1lKTsKKyAgICBpZiAoaW5kZXggPj0gMCkKKyAgICAgICAgcmV0dXJuIG1UZXh0dXJlcy52YWx1ZUF0KGluZGV4KTsKKyAgICByZXR1cm4gMDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvVGV4dHVyZU9iamVjdE1hbmFnZXIuaCBiL29wZW5nbC9saWJhZ2wvVGV4dHVyZU9iamVjdE1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGVkMWE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9UZXh0dXJlT2JqZWN0TWFuYWdlci5oCkBAIC0wLDAgKzEsMTQwIEBACisvKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX1NVUkZBQ0VfSAorI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX1NVUkZBQ0VfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxwcml2YXRlL3BpeGVsZmxpbmdlci9nZ2xfY29udGV4dC5oPgorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCisjaW5jbHVkZSAiVG9rZW5pemVyLmgiCisjaW5jbHVkZSAiVG9rZW5NYW5hZ2VyLmgiCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEVHTFRleHR1cmVPYmplY3QKK3sKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgRUdMVGV4dHVyZU9iamVjdCgpOworICAgICAgICAgICAgICAgICAgIH5FR0xUZXh0dXJlT2JqZWN0KCk7CisKKyAgICAvLyBwcm90b2NvbCBmb3Igc3A8PgorICAgIGlubGluZSAgdm9pZCAgICAgICAgaW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdDsKKyAgICBpbmxpbmUgIHZvaWQgICAgICAgIGRlY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3Q7CisgICAgaW5saW5lICB1aW50MzJfdCAgICBnZXRTdHJvbmdDb3VudCgpIGNvbnN0OworCisgICAgc3RhdHVzX3QgICAgICAgICAgICBzZXRTdXJmYWNlKEdHTFN1cmZhY2UgY29uc3QqIHMpOworICAgIHN0YXR1c190ICAgICAgICAgICAgcmVhbGxvY2F0ZShHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsIGludCBjb21wcmVzc2VkRm9ybWF0LCBpbnQgYnByKTsKKyAgICBpbmxpbmUgIHNpemVfdCAgICAgIHNpemUoKSBjb25zdDsKKyAgICBjb25zdCBHR0xTdXJmYWNlJiAgIG1pcChpbnQgbG9kKSBjb25zdDsKKyAgICBHR0xTdXJmYWNlJiAgICAgICAgIGVkaXRNaXAoaW50IGxvZCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICBoYXNNaXBtYXBzKCkgY29uc3QgeyByZXR1cm4gbU1pcG1hcHMhPTA7IH0KKyAgICBib29sICAgICAgICAgICAgICAgIGlzQ29tcGxldGUoKSBjb25zdCB7IHJldHVybiBtSXNDb21wbGV0ZTsgfQorICAgIHZvaWQgICAgICAgICAgICAgICAgY29weVBhcmFtZXRlcnMoY29uc3Qgc3A8RUdMVGV4dHVyZU9iamVjdD4mIG9sZCk7CisKK3ByaXZhdGU6CisgICAgICAgIHN0YXR1c190ICAgICAgICBhbGxvY2F0ZU1pcG1hcHMoKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGZyZWVNaXBtYXBzKCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBpbml0KCk7CisgICAgbXV0YWJsZSBpbnQzMl90ICAgICBtQ291bnQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgICBtU2l6ZTsKKyAgICBHR0xTdXJmYWNlICAgICAgICAgICptTWlwbWFwczsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1OdW1FeHRyYUxvZDsKKyAgICBib29sICAgICAgICAgICAgICAgIG1Jc0NvbXBsZXRlOworCitwdWJsaWM6CisgICAgR0dMU3VyZmFjZSAgICAgICAgICBzdXJmYWNlOworICAgIEdMZW51bSAgICAgICAgICAgICAgd3JhcHM7CisgICAgR0xlbnVtICAgICAgICAgICAgICB3cmFwdDsKKyAgICBHTGVudW0gICAgICAgICAgICAgIG1pbl9maWx0ZXI7CisgICAgR0xlbnVtICAgICAgICAgICAgICBtYWdfZmlsdGVyOworICAgIEdMZW51bSAgICAgICAgICAgICAgaW50ZXJuYWxmb3JtYXQ7CisgICAgR0xpbnQgICAgICAgICAgICAgICBjcm9wX3JlY3RbNF07CisgICAgR0xpbnQgICAgICAgICAgICAgICBnZW5lcmF0ZV9taXBtYXA7CisgICAgR0xpbnQgICAgICAgICAgICAgICBkaXJlY3Q7Cit9OworCit2b2lkIEVHTFRleHR1cmVPYmplY3Q6OmluY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3QgeworICAgIGFuZHJvaWRfYXRvbWljX2luYygmbUNvdW50KTsKK30KK3ZvaWQgRUdMVGV4dHVyZU9iamVjdDo6ZGVjU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdCB7CisgICAgaWYgKGFuZHJvaWRfYXRvbWljX2RlYygmbUNvdW50KSA9PSAxKSB7CisgICAgICAgIGRlbGV0ZSB0aGlzOworICAgIH0KK30KK3VpbnQzMl90IEVHTFRleHR1cmVPYmplY3Q6OmdldFN0cm9uZ0NvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtQ291bnQ7Cit9CitzaXplX3QgRUdMVGV4dHVyZU9iamVjdDo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNpemU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgRUdMU3VyZmFjZU1hbmFnZXIgOiBwdWJsaWMgVG9rZW5NYW5hZ2VyCit7CitwdWJsaWM6CisgICAgICAgICAgICAgICAgRUdMU3VyZmFjZU1hbmFnZXIoKTsKKyAgICAgICAgICAgICAgICB+RUdMU3VyZmFjZU1hbmFnZXIoKTsKKworICAgIC8vIHByb3RvY29sIGZvciBzcDw+CisgICAgaW5saW5lICB2b2lkICAgIGluY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3Q7CisgICAgaW5saW5lICB2b2lkICAgIGRlY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3Q7CisgICAgdHlwZWRlZiB2b2lkICAgIHdlYWtyZWZfdHlwZTsKKworICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+ICAgIGNyZWF0ZVRleHR1cmUoR0x1aW50IG5hbWUpOworICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+ICAgIHJlbW92ZVRleHR1cmUoR0x1aW50IG5hbWUpOworICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+ICAgIHJlcGxhY2VUZXh0dXJlKEdMdWludCBuYW1lKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICBkZWxldGVUZXh0dXJlcyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdG9rZW5zKTsKKyAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiAgICB0ZXh0dXJlKEdMdWludCBuYW1lKTsKKworcHJpdmF0ZToKKyAgICBtdXRhYmxlIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db3VudDsKKyAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOworICAgIEtleWVkVmVjdG9yPCBHTHVpbnQsIHNwPEVHTFRleHR1cmVPYmplY3Q+ID4gbVRleHR1cmVzOworfTsKKwordm9pZCBFR0xTdXJmYWNlTWFuYWdlcjo6aW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdCB7CisgICAgYW5kcm9pZF9hdG9taWNfaW5jKCZtQ291bnQpOworfQordm9pZCBFR0xTdXJmYWNlTWFuYWdlcjo6ZGVjU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdCB7CisgICAgaWYgKGFuZHJvaWRfYXRvbWljX2RlYygmbUNvdW50KSA9PSAxKSB7CisgICAgICAgIGRlbGV0ZSB0aGlzOworICAgIH0KK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9PUEVOR0xFU19TVVJGQUNFX0gKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9Ub2tlbk1hbmFnZXIuY3BwIGIvb3BlbmdsL2xpYmFnbC9Ub2tlbk1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTYwMjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL1Rva2VuTWFuYWdlci5jcHAKQEAgLTAsMCArMSw2MiBAQAorLyogbGlicy9vcGVuZ2xlcy9zdXJmYWNlLmNwcAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIlRva2VuTWFuYWdlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1Rva2VuTWFuYWdlcjo6VG9rZW5NYW5hZ2VyKCkKK3sKKyAgICAvLyB0b2tlbiAwIGlzIGFsd2F5cyByZXNlcnZlZAorICAgIG1Ub2tlbml6ZXIucmVzZXJ2ZSgwKTsKK30KKworVG9rZW5NYW5hZ2VyOjp+VG9rZW5NYW5hZ2VyKCkKK3sKK30KKworc3RhdHVzX3QgVG9rZW5NYW5hZ2VyOjpnZXRUb2tlbihHTHNpemVpIG4sIEdMdWludCAqdG9rZW5zKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChHTHNpemVpIGk9MCA7IGk8biA7IGkrKykKKyAgICAgICAgKnRva2VucysrID0gbVRva2VuaXplci5hY3F1aXJlKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIFRva2VuTWFuYWdlcjo6cmVjeWNsZVRva2VucyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdG9rZW5zKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChpbnQgaT0wIDsgaTxuIDsgaSsrKSB7CisgICAgICAgIGNvbnN0IEdMdWludCB0b2tlbiA9ICp0b2tlbnMrKzsKKyAgICAgICAgaWYgKHRva2VuKSB7CisgICAgICAgICAgICBtVG9rZW5pemVyLnJlbGVhc2UodG9rZW4pOworICAgICAgICB9CisgICAgfQorfQorCitib29sIFRva2VuTWFuYWdlcjo6aXNUb2tlblZhbGlkKEdMdWludCB0b2tlbikgY29uc3QKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtVG9rZW5pemVyLmlzQWNxdWlyZWQodG9rZW4pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL1Rva2VuTWFuYWdlci5oIGIvb3BlbmdsL2xpYmFnbC9Ub2tlbk1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWMxNDY5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9Ub2tlbk1hbmFnZXIuaApAQCAtMCwwICsxLDUzIEBACisvKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX1RPS0VOX01BTkFHRVJfSAorI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX1RPS0VOX01BTkFHRVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKyNpbmNsdWRlICJUb2tlbml6ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRva2VuTWFuYWdlcgoreworcHVibGljOgorICAgICAgICAgICAgICAgIFRva2VuTWFuYWdlcigpOworICAgICAgICAgICAgICAgIH5Ub2tlbk1hbmFnZXIoKTsKKworICAgIHN0YXR1c190ICAgIGdldFRva2VuKEdMc2l6ZWkgbiwgR0x1aW50ICp0b2tlbnMpOworICAgIHZvaWQgICAgICAgIHJlY3ljbGVUb2tlbnMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRva2Vucyk7CisgICAgYm9vbCAgICAgICAgaXNUb2tlblZhbGlkKEdMdWludCB0b2tlbikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOworICAgIFRva2VuaXplciAgICAgICBtVG9rZW5pemVyOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfVE9LRU5fTUFOQUdFUl9ICisKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvVG9rZW5pemVyLmNwcCBiL29wZW5nbC9saWJhZ2wvVG9rZW5pemVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjNlYTFhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9Ub2tlbml6ZXIuY3BwCkBAIC0wLDAgKzEsMTczIEBACisvKiBsaWJzL29wZW5nbGVzL1Rva2VuaXplci5jcHAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIlRva2VuaXplci5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQU5EUk9JRF9CQVNJQ19UWVBFU19UUkFJVFMoVG9rZW5pemVyOjpydW5fdCkKKworVG9rZW5pemVyOjpUb2tlbml6ZXIoKQoreworfQorCitUb2tlbml6ZXI6OlRva2VuaXplcihjb25zdCBUb2tlbml6ZXImIG90aGVyKQorICAgIDogbVJhbmdlcyhvdGhlci5tUmFuZ2VzKQoreworfQorCitUb2tlbml6ZXI6On5Ub2tlbml6ZXIoKQoreworfQorCit1aW50MzJfdCBUb2tlbml6ZXI6OmFjcXVpcmUoKQoreworICAgIGlmICghbVJhbmdlcy5zaXplKCkgfHwgbVJhbmdlc1swXS5maXJzdCkgeworICAgICAgICBfaW5zZXJ0VG9rZW5BdCgwLDApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgLy8ganVzdCBleHRlbmQgdGhlIGZpcnN0IHJ1bgorICAgIGNvbnN0IHJ1bl90JiBydW4gPSBtUmFuZ2VzWzBdOworICAgIHVpbnQzMl90IHRva2VuID0gcnVuLmZpcnN0ICsgcnVuLmxlbmd0aDsKKyAgICBfaW5zZXJ0VG9rZW5BdCh0b2tlbiwgMSk7CisgICAgcmV0dXJuIHRva2VuOworfQorCitib29sIFRva2VuaXplcjo6aXNBY3F1aXJlZCh1aW50MzJfdCB0b2tlbikgY29uc3QKK3sKKyAgICByZXR1cm4gKF9pbmRleE9yZGVyT2YodG9rZW4pID49IDApOworfQorCitzdGF0dXNfdCBUb2tlbml6ZXI6OnJlc2VydmUodWludDMyX3QgdG9rZW4pCit7CisgICAgc2l6ZV90IG87CisgICAgY29uc3Qgc3NpemVfdCBpID0gX2luZGV4T3JkZXJPZih0b2tlbiwgJm8pOworICAgIGlmIChpID49IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsgLy8gdGhpcyB0b2tlbiBpcyBhbHJlYWR5IHRha2VuCisgICAgfQorICAgIHNzaXplX3QgZXJyID0gX2luc2VydFRva2VuQXQodG9rZW4sIG8pOworICAgIHJldHVybiAoZXJyPDApID8gZXJyIDogc3RhdHVzX3QoTk9fRVJST1IpOworfQorCitzdGF0dXNfdCBUb2tlbml6ZXI6OnJlbGVhc2UodWludDMyX3QgdG9rZW4pCit7CisgICAgY29uc3Qgc3NpemVfdCBpID0gX2luZGV4T3JkZXJPZih0b2tlbik7CisgICAgaWYgKGkgPj0gMCkgeworICAgICAgICBjb25zdCBydW5fdCYgcnVuID0gbVJhbmdlc1tpXTsKKyAgICAgICAgaWYgKCh0b2tlbiA+PSBydW4uZmlyc3QpICYmICh0b2tlbiA8IHJ1bi5maXJzdCtydW4ubGVuZ3RoKSkgeworICAgICAgICAgICAgLy8gdG9rZW4gaW4gdGhpcyByYW5nZSwgd2UgbmVlZCB0byBzcGxpdAorICAgICAgICAgICAgcnVuX3QmIHJ1biA9IG1SYW5nZXMuZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgICAgIGlmICgodG9rZW4gPT0gcnVuLmZpcnN0KSB8fCAodG9rZW4gPT0gcnVuLmZpcnN0K3J1bi5sZW5ndGgtMSkpIHsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT0gcnVuLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgIHJ1bi5maXJzdCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBydW4ubGVuZ3RoIC09IDE7CisgICAgICAgICAgICAgICAgaWYgKHJ1bi5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBYWFg6IHNob3VsZCB3ZSBzeXN0ZW1hdGljYWxseSByZW1vdmUgYSBydW4gdGhhdCdzIGVtcHR5PworICAgICAgICAgICAgICAgICAgICBtUmFuZ2VzLnJlbW92ZUl0ZW1zQXQoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBzcGxpdCB0aGUgcnVuCisgICAgICAgICAgICAgICAgcnVuX3QgbmV3X3J1bjsKKyAgICAgICAgICAgICAgICBuZXdfcnVuLmZpcnN0ID0gdG9rZW4rMTsKKyAgICAgICAgICAgICAgICBuZXdfcnVuLmxlbmd0aCA9IHJ1bi5maXJzdCtydW4ubGVuZ3RoIC0gbmV3X3J1bi5maXJzdDsKKyAgICAgICAgICAgICAgICBydW4ubGVuZ3RoID0gdG9rZW4gLSBydW4uZmlyc3Q7CisgICAgICAgICAgICAgICAgbVJhbmdlcy5pbnNlcnRBdChuZXdfcnVuLCBpKzEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKK30KKworc3NpemVfdCBUb2tlbml6ZXI6Ol9pbmRleE9yZGVyT2YodWludDMyX3QgdG9rZW4sIHNpemVfdCogb3JkZXIpIGNvbnN0Cit7CisgICAgLy8gYmluYXJ5IHNlYXJjaAorICAgIHNzaXplX3QgZXJyID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgc3NpemVfdCBsID0gMDsKKyAgICBzc2l6ZV90IGggPSBtUmFuZ2VzLnNpemUoKS0xOworICAgIHNzaXplX3QgbWlkOworICAgIGNvbnN0IHJ1bl90KiBhID0gbVJhbmdlcy5hcnJheSgpOworICAgIHdoaWxlIChsIDw9IGgpIHsKKyAgICAgICAgbWlkID0gbCArIChoIC0gbCkvMjsKKyAgICAgICAgY29uc3QgcnVuX3QqIGNvbnN0IGN1cnIgPSBhICsgbWlkOworICAgICAgICBpbnQgYyA9IDA7CisgICAgICAgIGlmICh0b2tlbiA8IGN1cnItPmZpcnN0KSAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAxOworICAgICAgICBlbHNlIGlmICh0b2tlbiA+PSBjdXJyLT5maXJzdCtjdXJyLT5sZW5ndGgpICAgICBjID0gLTE7CisgICAgICAgIGlmIChjID09IDApIHsKKyAgICAgICAgICAgIGVyciA9IGwgPSBtaWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChjIDwgMCkgeworICAgICAgICAgICAgbCA9IG1pZCArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoID0gbWlkIC0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob3JkZXIpICpvcmRlciA9IGw7CisgICAgcmV0dXJuIGVycjsKK30KKworc3NpemVfdCBUb2tlbml6ZXI6Ol9pbnNlcnRUb2tlbkF0KHVpbnQzMl90IHRva2VuLCBzaXplX3QgaW5kZXgpCit7CisgICAgY29uc3Qgc2l6ZV90IGMgPSBtUmFuZ2VzLnNpemUoKTsKKworICAgIGlmIChpbmRleCA+PSAxKSB7CisgICAgICAgIC8vIGRvIHdlIG5lZWQgdG8gbWVyZ2Ugd2l0aCB0aGUgcHJldmlvdXMgcnVuPworICAgICAgICBydW5fdCYgcCA9IG1SYW5nZXMuZWRpdEl0ZW1BdChpbmRleC0xKTsKKyAgICAgICAgaWYgKHAuZmlyc3QrcC5sZW5ndGggPT0gdG9rZW4pIHsKKyAgICAgICAgICAgIHAubGVuZ3RoICs9IDE7CisgICAgICAgICAgICBpZiAoaW5kZXggPCBjKSB7CisgICAgICAgICAgICAgICAgY29uc3QgcnVuX3QmIG4gPSBtUmFuZ2VzW2luZGV4XTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4rMSA9PSBuLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgIHAubGVuZ3RoICs9IG4ubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBtUmFuZ2VzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoaW5kZXggPCBjKSB7CisgICAgICAgIC8vIGRvIHdlIG5lZWQgdG8gbWVyZ2Ugd2l0aCB0aGUgbmV4dCBydW4/CisgICAgICAgIHJ1bl90JiBuID0gbVJhbmdlcy5lZGl0SXRlbUF0KGluZGV4KTsKKyAgICAgICAgaWYgKHRva2VuKzEgPT0gbi5maXJzdCkgeworICAgICAgICAgICAgbi5maXJzdCAtPSAxOworICAgICAgICAgICAgbi5sZW5ndGggKz0gMTsKKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtUmFuZ2VzLmluc2VydEF0KHJ1bl90KHRva2VuLDEpLCBpbmRleCk7Cit9CisKK3ZvaWQgVG9rZW5pemVyOjpkdW1wKCkgY29uc3QKK3sKKyAgICBjb25zdCBydW5fdCogcmFuZ2VzID0gbVJhbmdlcy5hcnJheSgpOworICAgIGNvbnN0IHNpemVfdCBjID0gbVJhbmdlcy5zaXplKCk7CisgICAgTE9HRCgiVG9rZW5pemVyICglcCwgc2l6ZSA9ICV1KVxuIiwgdGhpcywgYyk7CisgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjIDsgaSsrKSB7CisgICAgICAgIExPR0QoIiV1OiAoJXUsICV1KVxuIiwgaSwgcmFuZ2VzW2ldLmZpcnN0LCByYW5nZXNbaV0ubGVuZ3RoKTsKKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvVG9rZW5pemVyLmggYi9vcGVuZ2wvbGliYWdsL1Rva2VuaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNTU1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL1Rva2VuaXplci5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIGxpYnMvb3BlbmdsZXMvVG9rZW5pemVyLmgKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKKyNpZm5kZWYgQU5EUk9JRF9PUEVOR0xFU19UT0tFTklaRVJfSAorI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX1RPS0VOSVpFUl9ICisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFRva2VuaXplcgoreworcHVibGljOgorICAgICAgICAgICAgICAgIFRva2VuaXplcigpOworICAgICAgICAgICAgICAgIFRva2VuaXplcihjb25zdCBUb2tlbml6ZXImIG90aGVyKTsKKyAgICAgICAgICAgICAgICB+VG9rZW5pemVyKCk7CisKKyAgICB1aW50MzJfdCAgICBhY3F1aXJlKCk7CisgICAgc3RhdHVzX3QgICAgcmVzZXJ2ZSh1aW50MzJfdCB0b2tlbik7CisgICAgc3RhdHVzX3QgICAgcmVsZWFzZSh1aW50MzJfdCB0b2tlbik7CisgICAgYm9vbCAgICAgICAgaXNBY3F1aXJlZCh1aW50MzJfdCB0b2tlbikgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAgIHN0cnVjdCBydW5fdCB7CisgICAgICAgIHJ1bl90KCkge307CisgICAgICAgIHJ1bl90KHVpbnQzMl90IGYsIHVpbnQzMl90IGwpIDogZmlyc3QoZiksIGxlbmd0aChsKSB7fQorICAgICAgICB1aW50MzJfdCAgICBmaXJzdDsKKyAgICAgICAgdWludDMyX3QgICAgbGVuZ3RoOworICAgIH07Citwcml2YXRlOgorICAgIHNzaXplX3QgX2luZGV4T3JkZXJPZih1aW50MzJfdCB0b2tlbiwgc2l6ZV90KiBvcmRlcj0wKSBjb25zdDsKKyAgICBzc2l6ZV90IF9pbnNlcnRUb2tlbkF0KHVpbnQzMl90IHRva2VuLCBzaXplX3QgaW5kZXgpOworICAgIFZlY3RvcjxydW5fdD4gICBtUmFuZ2VzOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gQU5EUk9JRF9PUEVOR0xFU19UT0tFTklaRVJfSApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9hcnJheS5jcHAgYi9vcGVuZ2wvbGliYWdsL2FycmF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmE3NTY2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9hcnJheS5jcHAKQEAgLTAsMCArMSwxNTU3IEBACisvKiAKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiY29udGV4dC5oIgorI2luY2x1ZGUgImZwLmgiCisjaW5jbHVkZSAic3RhdGUuaCIKKyNpbmNsdWRlICJtYXRyaXguaCIKKyNpbmNsdWRlICJ2ZXJ0ZXguaCIKKyNpbmNsdWRlICJsaWdodC5oIgorI2luY2x1ZGUgInByaW1pdGl2ZXMuaCIKKyNpbmNsdWRlICJ0ZXh0dXJlLmgiCisjaW5jbHVkZSAiQnVmZmVyT2JqZWN0TWFuYWdlci5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgVkNfQ0FDSEVfU1RBVElTVElDUyAgICAgMAorI2RlZmluZSBWQ19DQUNIRV9UWVBFX05PTkUgICAgICAwCisjZGVmaW5lIFZDX0NBQ0hFX1RZUEVfSU5ERVhFRCAgIDEKKyNkZWZpbmUgVkNfQ0FDSEVfVFlQRV9MUlUgICAgICAgMgorI2RlZmluZSBWQ19DQUNIRV9UWVBFICAgICAgICAgICBWQ19DQUNIRV9UWVBFX0lOREVYRUQKKworI2lmIFZDX0NBQ0hFX1NUQVRJU1RJQ1MKKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIHZvaWQgdmFsaWRhdGVfYXJyYXlzKG9nbGVzX2NvbnRleHRfdCogYywgR0xlbnVtIG1vZGUpOworCitzdGF0aWMgdm9pZCBjb21waWxlRWxlbWVudHNfX2dlbmVyaWMob2dsZXNfY29udGV4dF90KiwKKyAgICAgICAgdmVydGV4X3QqLCBHTGludCwgR0xzaXplaSk7CitzdGF0aWMgdm9pZCBjb21waWxlRWxlbWVudF9fZ2VuZXJpYyhvZ2xlc19jb250ZXh0X3QqLAorICAgICAgICB2ZXJ0ZXhfdCosIEdMaW50KTsKKworc3RhdGljIHZvaWQgZHJhd1ByaW1pdGl2ZXNQb2ludHMob2dsZXNfY29udGV4dF90KiwgR0xpbnQsIEdMc2l6ZWkpOworc3RhdGljIHZvaWQgZHJhd1ByaW1pdGl2ZXNMaW5lU3RyaXAob2dsZXNfY29udGV4dF90KiwgR0xpbnQsIEdMc2l6ZWkpOworc3RhdGljIHZvaWQgZHJhd1ByaW1pdGl2ZXNMaW5lTG9vcChvZ2xlc19jb250ZXh0X3QqLCBHTGludCwgR0xzaXplaSk7CitzdGF0aWMgdm9pZCBkcmF3UHJpbWl0aXZlc0xpbmVzKG9nbGVzX2NvbnRleHRfdCosIEdMaW50LCBHTHNpemVpKTsKK3N0YXRpYyB2b2lkIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVTdHJpcChvZ2xlc19jb250ZXh0X3QqLCBHTGludCwgR0xzaXplaSk7CitzdGF0aWMgdm9pZCBkcmF3UHJpbWl0aXZlc1RyaWFuZ2xlRmFuKG9nbGVzX2NvbnRleHRfdCosIEdMaW50LCBHTHNpemVpKTsKK3N0YXRpYyB2b2lkIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVzKG9nbGVzX2NvbnRleHRfdCosIEdMaW50LCBHTHNpemVpKTsKKworc3RhdGljIHZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzUG9pbnRzKG9nbGVzX2NvbnRleHRfdCosCisgICAgICAgIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCopOworc3RhdGljIHZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZVN0cmlwKG9nbGVzX2NvbnRleHRfdCosCisgICAgICAgIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCopOworc3RhdGljIHZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZUxvb3Aob2dsZXNfY29udGV4dF90KiwKKyAgICAgICAgR0xzaXplaSwgY29uc3QgR0x2b2lkKik7CitzdGF0aWMgdm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNMaW5lcyhvZ2xlc19jb250ZXh0X3QqLAorICAgICAgICBHTHNpemVpLCBjb25zdCBHTHZvaWQqKTsKK3N0YXRpYyB2b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlU3RyaXAob2dsZXNfY29udGV4dF90KiwKKyAgICAgICAgR0xzaXplaSwgY29uc3QgR0x2b2lkKik7CitzdGF0aWMgdm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNUcmlhbmdsZUZhbihvZ2xlc19jb250ZXh0X3QqLAorICAgICAgICBHTHNpemVpLCBjb25zdCBHTHZvaWQqKTsKK3N0YXRpYyB2b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlcyhvZ2xlc19jb250ZXh0X3QqLAorICAgICAgICBHTHNpemVpLCBjb25zdCBHTHZvaWQqKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHZvaWQgKCphcnJheXNfcHJpbXNfZmN0X3QpKG9nbGVzX2NvbnRleHRfdCosIEdMaW50LCBHTHNpemVpKTsKK3N0YXRpYyBjb25zdCBhcnJheXNfcHJpbXNfZmN0X3QgZHJhd0FycmF5c1ByaW1zW10gPSB7CisgICAgZHJhd1ByaW1pdGl2ZXNQb2ludHMsCisgICAgZHJhd1ByaW1pdGl2ZXNMaW5lcywKKyAgICBkcmF3UHJpbWl0aXZlc0xpbmVMb29wLAorICAgIGRyYXdQcmltaXRpdmVzTGluZVN0cmlwLAorICAgIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVzLAorICAgIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVTdHJpcCwKKyAgICBkcmF3UHJpbWl0aXZlc1RyaWFuZ2xlRmFuCit9OworCit0eXBlZGVmIHZvaWQgKCplbGVtZW50c19wcmltc19mY3RfdCkob2dsZXNfY29udGV4dF90KiwgR0xzaXplaSwgY29uc3QgR0x2b2lkKik7CitzdGF0aWMgY29uc3QgZWxlbWVudHNfcHJpbXNfZmN0X3QgZHJhd0VsZW1lbnRzUHJpbXNbXSA9IHsKKyAgICBkcmF3SW5kZXhlZFByaW1pdGl2ZXNQb2ludHMsCisgICAgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZXMsCisgICAgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZUxvb3AsCisgICAgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZVN0cmlwLAorICAgIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlcywKKyAgICBkcmF3SW5kZXhlZFByaW1pdGl2ZXNUcmlhbmdsZVN0cmlwLAorICAgIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlRmFuCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNlbmRpZgorCit2b2lkIG9nbGVzX2luaXRfYXJyYXkob2dsZXNfY29udGV4dF90KiBjKQoreworICAgIGMtPmFycmF5cy52ZXJ0ZXguc2l6ZSA9IDQ7CisgICAgYy0+YXJyYXlzLnZlcnRleC50eXBlID0gR0xfRkxPQVQ7CisgICAgYy0+YXJyYXlzLmNvbG9yLnNpemUgPSA0OworICAgIGMtPmFycmF5cy5jb2xvci50eXBlID0gR0xfRkxPQVQ7CisgICAgYy0+YXJyYXlzLm5vcm1hbC5zaXplID0gNDsKKyAgICBjLT5hcnJheXMubm9ybWFsLnR5cGUgPSBHTF9GTE9BVDsKKyAgICBmb3IgKGludCBpPTAgOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKKyAgICAgICAgYy0+YXJyYXlzLnRleHR1cmVbaV0uc2l6ZSA9IDQ7CisgICAgICAgIGMtPmFycmF5cy50ZXh0dXJlW2ldLnR5cGUgPSBHTF9GTE9BVDsKKyAgICB9CisgICAgYy0+dmMuaW5pdCgpOworCisgICAgaWYgKCFjLT52Yy52QnVmZmVyKSB7CisgICAgICAgIC8vIHRoaXMgY291bGQgaGF2ZSBmYWlsZWQKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfT1VUX09GX01FTU9SWSk7CisgICAgfQorfQorCit2b2lkIG9nbGVzX3VuaW5pdF9hcnJheShvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgYy0+dmMudW5pbml0KCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAwCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIEFycmF5IGZldGNoZXJzCisjZW5kaWYKKworc3RhdGljIHZvaWQgY3VycmVudENvbG9yKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCogdiwgY29uc3QgR0x2b2lkKikgeworICAgIG1lbWNweSh2LCBjLT5jdXJyZW50LmNvbG9yLnYsIHNpemVvZih2ZWM0X3QpKTsKK30KK3N0YXRpYyB2b2lkIGN1cnJlbnRDb2xvcl9jbGFtcChvZ2xlc19jb250ZXh0X3QqIGMsIEdMZml4ZWQqIHYsIGNvbnN0IEdMdm9pZCopIHsKKyAgICBtZW1jcHkodiwgYy0+Y3VycmVudENvbG9yQ2xhbXBlZC52LCBzaXplb2YodmVjNF90KSk7Cit9CitzdGF0aWMgdm9pZCBjdXJyZW50Tm9ybWFsKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCogdiwgY29uc3QgR0x2b2lkKikgeworICAgIG1lbWNweSh2LCBjLT5jdXJyZW50Tm9ybWFsLnYsIHNpemVvZih2ZWMzX3QpKTsKK30KK3N0YXRpYyB2b2lkIGN1cnJlbnRUZXhDb29yZChvZ2xlc19jb250ZXh0X3QqIGMsIEdMZml4ZWQqIHYsIGNvbnN0IEdMdm9pZCopIHsKKyAgICBtZW1jcHkodiwgYy0+Y3VycmVudC50ZXh0dXJlW2MtPmFycmF5cy50bXVdLnYsIHNpemVvZih2ZWM0X3QpKTsKK30KKworCitzdGF0aWMgdm9pZCBmZXRjaE5vcChvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiwgY29uc3QgR0x2b2lkKikgeworfQorc3RhdGljIHZvaWQgZmV0Y2gyYihvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGJ5dGUqIHApIHsKKyAgICB2WzBdID0gZ2dsSW50VG9GaXhlZChwWzBdKTsKKyAgICB2WzFdID0gZ2dsSW50VG9GaXhlZChwWzFdKTsKK30KK3N0YXRpYyB2b2lkIGZldGNoMnMob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xzaG9ydCogcCkgeworICAgIHZbMF0gPSBnZ2xJbnRUb0ZpeGVkKHBbMF0pOworICAgIHZbMV0gPSBnZ2xJbnRUb0ZpeGVkKHBbMV0pOworfQorc3RhdGljIHZvaWQgZmV0Y2gyeChvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGZpeGVkKiBwKSB7CisgICAgbWVtY3B5KHYsIHAsIDIqc2l6ZW9mKEdMZml4ZWQpKTsKK30KK3N0YXRpYyB2b2lkIGZldGNoMmYob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xmbG9hdCogcCkgeworICAgIHZbMF0gPSBnZ2xGbG9hdFRvRml4ZWQocFswXSk7CisgICAgdlsxXSA9IGdnbEZsb2F0VG9GaXhlZChwWzFdKTsKK30KK3N0YXRpYyB2b2lkIGZldGNoM2Iob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xieXRlKiBwKSB7CisgICAgdlswXSA9IGdnbEludFRvRml4ZWQocFswXSk7CisgICAgdlsxXSA9IGdnbEludFRvRml4ZWQocFsxXSk7CisgICAgdlsyXSA9IGdnbEludFRvRml4ZWQocFsyXSk7Cit9CitzdGF0aWMgdm9pZCBmZXRjaDNzKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMc2hvcnQqIHApIHsKKyAgICB2WzBdID0gZ2dsSW50VG9GaXhlZChwWzBdKTsKKyAgICB2WzFdID0gZ2dsSW50VG9GaXhlZChwWzFdKTsKKyAgICB2WzJdID0gZ2dsSW50VG9GaXhlZChwWzJdKTsKK30KK3N0YXRpYyB2b2lkIGZldGNoM3gob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xmaXhlZCogcCkgeworICAgIG1lbWNweSh2LCBwLCAzKnNpemVvZihHTGZpeGVkKSk7Cit9CitzdGF0aWMgdm9pZCBmZXRjaDNmKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMZmxvYXQqIHApIHsKKyAgICB2WzBdID0gZ2dsRmxvYXRUb0ZpeGVkKHBbMF0pOworICAgIHZbMV0gPSBnZ2xGbG9hdFRvRml4ZWQocFsxXSk7CisgICAgdlsyXSA9IGdnbEZsb2F0VG9GaXhlZChwWzJdKTsKK30KK3N0YXRpYyB2b2lkIGZldGNoNGIob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xieXRlKiBwKSB7CisgICAgdlswXSA9IGdnbEludFRvRml4ZWQocFswXSk7CisgICAgdlsxXSA9IGdnbEludFRvRml4ZWQocFsxXSk7CisgICAgdlsyXSA9IGdnbEludFRvRml4ZWQocFsyXSk7CisgICAgdlszXSA9IGdnbEludFRvRml4ZWQocFszXSk7Cit9CitzdGF0aWMgdm9pZCBmZXRjaDRzKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMc2hvcnQqIHApIHsKKyAgICB2WzBdID0gZ2dsSW50VG9GaXhlZChwWzBdKTsKKyAgICB2WzFdID0gZ2dsSW50VG9GaXhlZChwWzFdKTsKKyAgICB2WzJdID0gZ2dsSW50VG9GaXhlZChwWzJdKTsKKyAgICB2WzNdID0gZ2dsSW50VG9GaXhlZChwWzNdKTsKK30KK3N0YXRpYyB2b2lkIGZldGNoNHgob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xmaXhlZCogcCkgeworICAgIG1lbWNweSh2LCBwLCA0KnNpemVvZihHTGZpeGVkKSk7Cit9CitzdGF0aWMgdm9pZCBmZXRjaDRmKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMZmxvYXQqIHApIHsKKyAgICB2WzBdID0gZ2dsRmxvYXRUb0ZpeGVkKHBbMF0pOworICAgIHZbMV0gPSBnZ2xGbG9hdFRvRml4ZWQocFsxXSk7CisgICAgdlsyXSA9IGdnbEZsb2F0VG9GaXhlZChwWzJdKTsKKyAgICB2WzNdID0gZ2dsRmxvYXRUb0ZpeGVkKHBbM10pOworfQorc3RhdGljIHZvaWQgZmV0Y2hFeHBhbmQ0dWIob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0x1Ynl0ZSogcCkgeworICAgIHZbMF0gPSBHR0xfVUJfVE9fWChwWzBdKTsKKyAgICB2WzFdID0gR0dMX1VCX1RPX1gocFsxXSk7CisgICAgdlsyXSA9IEdHTF9VQl9UT19YKHBbMl0pOworICAgIHZbM10gPSBHR0xfVUJfVE9fWChwWzNdKTsKK30KK3N0YXRpYyB2b2lkIGZldGNoQ2xhbXA0eChvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGZpeGVkKiBwKSB7CisgICAgdlswXSA9IGdnbENsYW1weChwWzBdKTsKKyAgICB2WzFdID0gZ2dsQ2xhbXB4KHBbMV0pOworICAgIHZbMl0gPSBnZ2xDbGFtcHgocFsyXSk7CisgICAgdlszXSA9IGdnbENsYW1weChwWzNdKTsKK30KK3N0YXRpYyB2b2lkIGZldGNoQ2xhbXA0ZihvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGZsb2F0KiBwKSB7CisgICAgdlswXSA9IGdnbENsYW1weChnZ2xGbG9hdFRvRml4ZWQocFswXSkpOworICAgIHZbMV0gPSBnZ2xDbGFtcHgoZ2dsRmxvYXRUb0ZpeGVkKHBbMV0pKTsKKyAgICB2WzJdID0gZ2dsQ2xhbXB4KGdnbEZsb2F0VG9GaXhlZChwWzJdKSk7CisgICAgdlszXSA9IGdnbENsYW1weChnZ2xGbG9hdFRvRml4ZWQocFszXSkpOworfQorc3RhdGljIHZvaWQgZmV0Y2hFeHBhbmQzdWIob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0x1Ynl0ZSogcCkgeworICAgIHZbMF0gPSBHR0xfVUJfVE9fWChwWzBdKTsKKyAgICB2WzFdID0gR0dMX1VCX1RPX1gocFsxXSk7CisgICAgdlsyXSA9IEdHTF9VQl9UT19YKHBbMl0pOworICAgIHZbM10gPSAweDEwMDAwOworfQorc3RhdGljIHZvaWQgZmV0Y2hDbGFtcDN4KG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMZml4ZWQqIHApIHsKKyAgICB2WzBdID0gZ2dsQ2xhbXB4KHBbMF0pOworICAgIHZbMV0gPSBnZ2xDbGFtcHgocFsxXSk7CisgICAgdlsyXSA9IGdnbENsYW1weChwWzJdKTsKKyAgICB2WzNdID0gMHgxMDAwMDsKK30KK3N0YXRpYyB2b2lkIGZldGNoQ2xhbXAzZihvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGZsb2F0KiBwKSB7CisgICAgdlswXSA9IGdnbENsYW1weChnZ2xGbG9hdFRvRml4ZWQocFswXSkpOworICAgIHZbMV0gPSBnZ2xDbGFtcHgoZ2dsRmxvYXRUb0ZpeGVkKHBbMV0pKTsKKyAgICB2WzJdID0gZ2dsQ2xhbXB4KGdnbEZsb2F0VG9GaXhlZChwWzJdKSk7CisgICAgdlszXSA9IDB4MTAwMDA7Cit9CitzdGF0aWMgdm9pZCBmZXRjaEV4cGFuZDNiKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMYnl0ZSogcCkgeworICAgIHZbMF0gPSBHR0xfQl9UT19YKHBbMF0pOworICAgIHZbMV0gPSBHR0xfQl9UT19YKHBbMV0pOworICAgIHZbMl0gPSBHR0xfQl9UT19YKHBbMl0pOworfQorc3RhdGljIHZvaWQgZmV0Y2hFeHBhbmQzcyhvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTHNob3J0KiBwKSB7CisgICAgdlswXSA9IEdHTF9TX1RPX1gocFswXSk7CisgICAgdlsxXSA9IEdHTF9TX1RPX1gocFsxXSk7CisgICAgdlsyXSA9IEdHTF9TX1RPX1gocFsyXSk7Cit9CisKK3R5cGVkZWYgYXJyYXlfdDo6ZmV0Y2hlcl90IGZuX3Q7IAorCitzdGF0aWMgY29uc3QgZm5fdCBjb2xvcl9mY3RbMl1bMTZdID0geyAvLyBzaXplPXszLDR9LCB0eXBlPXt1YixmLHh9CisgICAgeyAwLCAoZm5fdClmZXRjaEV4cGFuZDN1YiwgMCwgMCwgMCwgMCwKKyAgICAgICAgIChmbl90KWZldGNoM2YsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAoZm5fdClmZXRjaDN4IH0sCisgICAgeyAwLCAoZm5fdClmZXRjaEV4cGFuZDR1YiwgMCwgMCwgMCwgMCwKKyAgICAgICAgIChmbl90KWZldGNoNGYsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAoZm5fdClmZXRjaDR4IH0sCit9Oworc3RhdGljIGNvbnN0IGZuX3QgY29sb3JfY2xhbXBfZmN0WzJdWzE2XSA9IHsgLy8gc2l6ZT17Myw0fSwgdHlwZT17dWIsZix4fQorICAgIHsgMCwgKGZuX3QpZmV0Y2hFeHBhbmQzdWIsIDAsIDAsIDAsIDAsCisgICAgICAgICAoZm5fdClmZXRjaENsYW1wM2YsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAoZm5fdClmZXRjaENsYW1wM3ggfSwKKyAgICB7IDAsIChmbl90KWZldGNoRXhwYW5kNHViLCAwLCAwLCAwLCAwLAorICAgICAgICAgKGZuX3QpZmV0Y2hDbGFtcDRmLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgKGZuX3QpZmV0Y2hDbGFtcDR4IH0sCit9Oworc3RhdGljIGNvbnN0IGZuX3Qgbm9ybWFsX2ZjdFsxXVsxNl0gPSB7IC8vIHNpemU9ezN9LCB0eXBlPXtiLHMsZix4fQorICAgIHsgKGZuX3QpZmV0Y2hFeHBhbmQzYiwgMCwKKyAgICAgIChmbl90KWZldGNoRXhwYW5kM3MsIDAsIDAsIDAsCisgICAgICAoZm5fdClmZXRjaDNmLCAwLCAwLCAwLCAwLCAwLAorICAgICAgKGZuX3QpZmV0Y2gzeCB9LAorfTsKK3N0YXRpYyBjb25zdCBmbl90IHZlcnRleF9mY3RbM11bMTZdID0geyAvLyBzaXplPXsyLDMsNH0sIHR5cGU9e2IscyxmLHh9CisgICAgeyAoZm5fdClmZXRjaDJiLCAwLAorICAgICAgKGZuX3QpZmV0Y2gycywgMCwgMCwgMCwKKyAgICAgIChmbl90KWZldGNoMmYsIDAsIDAsIDAsIDAsIDAsCisgICAgICAoZm5fdClmZXRjaDN4IH0sCisgICAgeyAoZm5fdClmZXRjaDNiLCAwLAorICAgICAgKGZuX3QpZmV0Y2gzcywgMCwgMCwgMCwKKyAgICAgIChmbl90KWZldGNoM2YsIDAsIDAsIDAsIDAsIDAsCisgICAgICAoZm5fdClmZXRjaDN4IH0sCisgICAgeyAoZm5fdClmZXRjaDRiLCAwLAorICAgICAgKGZuX3QpZmV0Y2g0cywgMCwgMCwgMCwKKyAgICAgIChmbl90KWZldGNoNGYsIDAsIDAsIDAsIDAsIDAsCisgICAgICAoZm5fdClmZXRjaDR4IH0KK307CitzdGF0aWMgY29uc3QgZm5fdCB0ZXh0dXJlX2ZjdFszXVsxNl0gPSB7IC8vIHNpemU9ezIsMyw0fSwgdHlwZT17YixzLGYseH0KKyAgICB7IChmbl90KWZldGNoMmIsIDAsCisgICAgICAoZm5fdClmZXRjaDJzLCAwLCAwLCAwLAorICAgICAgKGZuX3QpZmV0Y2gyZiwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIChmbl90KWZldGNoMnggfSwKKyAgICB7IChmbl90KWZldGNoM2IsIDAsCisgICAgICAoZm5fdClmZXRjaDNzLCAwLCAwLCAwLAorICAgICAgKGZuX3QpZmV0Y2gzZiwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIChmbl90KWZldGNoM3ggfSwKKyAgICB7IChmbl90KWZldGNoNGIsIDAsCisgICAgICAoZm5fdClmZXRjaDRzLCAwLCAwLCAwLAorICAgICAgKGZuX3QpZmV0Y2g0ZiwgMCwgMCwgMCwgMCwgMCwKKyAgICAgIChmbl90KWZldGNoNHggfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgYXJyYXlfdAorI2VuZGlmCisKK3ZvaWQgYXJyYXlfdDo6aW5pdCgKKyAgICAgICAgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLAorICAgICAgICBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIGNvbnN0IGJ1ZmZlcl90KiBibywgR0xzaXplaSBjb3VudCkKK3sKKyAgICBpZiAoIXN0cmlkZSkgeworICAgICAgICBzdHJpZGUgPSBzaXplOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBHTF9TSE9SVDoKKyAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVDoKKyAgICAgICAgICAgIHN0cmlkZSAqPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfRkxPQVQ6CisgICAgICAgIGNhc2UgR0xfRklYRUQ6CisgICAgICAgICAgICBzdHJpZGUgKj0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHRoaXMtPnNpemUgPSBzaXplOworICAgIHRoaXMtPnR5cGUgPSB0eXBlOworICAgIHRoaXMtPnN0cmlkZSA9IHN0cmlkZTsKKyAgICB0aGlzLT5wb2ludGVyID0gcG9pbnRlcjsKKyAgICB0aGlzLT5ibyA9IGJvOworICAgIHRoaXMtPmJvdW5kcyA9IGNvdW50OworfQorCitpbmxpbmUgdm9pZCBhcnJheV90OjpyZXNvbHZlKCkgCit7CisgICAgcGh5c2ljYWxfcG9pbnRlciA9IChibykgPyAoYm8tPmRhdGEgKyB1aW50cHRyX3QocG9pbnRlcikpIDogcG9pbnRlcjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgdmVydGV4X2NhY2hlX3QKKyNlbmRpZgorCit2b2lkIHZlcnRleF9jYWNoZV90Ojppbml0KCkKK3sKKyAgICAvLyBtYWtlIHN1cmUgdGhlIHNpemUgb2YgdmVydGV4X3QgYWxsb3dzIGNhY2hlLWxpbmUgYWxpZ25tZW50CisgICAgQ1RBPChzaXplb2YodmVydGV4X3QpICYgMHgxRikgPT0gMD4gYXNzZXJ0QWxpZ25lZFNpemU7CisKKyAgICBjb25zdCBpbnQgYWxpZ24gPSAzMjsKKyAgICBjb25zdCBzaXplX3QgcyA9IFZFUlRFWF9CVUZGRVJfU0laRSArIFZFUlRFWF9DQUNIRV9TSVpFOworICAgIGNvbnN0IHNpemVfdCBzaXplID0gcypzaXplb2YodmVydGV4X3QpICsgYWxpZ247CisgICAgYmFzZSA9IG1hbGxvYyhzaXplKTsKKyAgICBpZiAoYmFzZSkgeworICAgICAgICBtZW1zZXQoYmFzZSwgMCwgc2l6ZSk7CisgICAgICAgIHZCdWZmZXIgPSAodmVydGV4X3QqKSgoc2l6ZV90KGJhc2UpICsgYWxpZ24gLSAxKSAmIH4oYWxpZ24tMSkpOworICAgICAgICB2Q2FjaGUgPSB2QnVmZmVyICsgVkVSVEVYX0JVRkZFUl9TSVpFOworICAgICAgICBzZXF1ZW5jZSA9IDA7CisgICAgfQorfQorCit2b2lkIHZlcnRleF9jYWNoZV90Ojp1bmluaXQoKQoreworICAgIGZyZWUoYmFzZSk7CisgICAgYmFzZSA9IHZCdWZmZXIgPSB2Q2FjaGUgPSAwOworfQorCit2b2lkIHZlcnRleF9jYWNoZV90OjpjbGVhcigpCit7CisjaWYgVkNfQ0FDSEVfU1RBVElTVElDUworICAgIHN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKKyAgICB0b3RhbCA9IDA7CisgICAgbWlzc2VzID0gMDsKKyNlbmRpZgorCisjaWYgVkNfQ0FDSEVfVFlQRSA9PSBWQ19DQUNIRV9UWVBFX0xSVQorICAgIHZlcnRleF90KiB2ID0gdkJ1ZmZlcjsKKyAgICBzaXplX3QgY291bnQgPSBWRVJURVhfQlVGRkVSX1NJWkUgKyBWRVJURVhfQ0FDSEVfU0laRTsKKyAgICBkbyB7CisgICAgICAgIHYtPm1ydSA9IDA7CisgICAgICAgIHYrKzsKKyAgICB9IHdoaWxlICgtLWNvdW50KTsKKyNlbmRpZgorCisgICAgc2VxdWVuY2UgKz0gSU5ERVhfU0VROworICAgIGlmIChzZXF1ZW5jZSA+PSAweDgwMDAwMDAwTFUpIHsKKyAgICAgICAgc2VxdWVuY2UgPSBJTkRFWF9TRVE7CisgICAgICAgIHZlcnRleF90KiB2ID0gdkJ1ZmZlcjsKKyAgICAgICAgc2l6ZV90IGNvdW50ID0gVkVSVEVYX0JVRkZFUl9TSVpFICsgVkVSVEVYX0NBQ0hFX1NJWkU7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHYtPmluZGV4ID0gMDsKKyAgICAgICAgICAgIHYrKzsKKyAgICAgICAgfSB3aGlsZSAoLS1jb3VudCk7CisgICAgfQorfQorCit2b2lkIHZlcnRleF9jYWNoZV90OjpkdW1wX3N0YXRzKEdMZW51bSBtb2RlKQoreworI2lmIFZDX0NBQ0hFX1NUQVRJU1RJQ1MKKyAgICBuc2Vjc190IHRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCkgLSBzdGFydFRpbWU7CisgICAgdWludDMyX3QgaGl0cyA9IHRvdGFsIC0gbWlzc2VzOworICAgIHVpbnQzMl90IHByaW1fY291bnQ7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBHTF9QT0lOVFM6ICAgICAgICAgICAgIHByaW1fY291bnQgPSB0b3RhbDsgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0xJTkVfU1RSSVA6ICAgICAgICAgcHJpbV9jb3VudCA9IHRvdGFsIC0gMTsgICAgIGJyZWFrOworICAgIGNhc2UgR0xfTElORV9MT09QOiAgICAgICAgICBwcmltX2NvdW50ID0gdG90YWwgLSAxOyAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9MSU5FUzogICAgICAgICAgICAgIHByaW1fY291bnQgPSB0b3RhbCAvIDI7ICAgICBicmVhazsKKyAgICBjYXNlIEdMX1RSSUFOR0xFX1NUUklQOiAgICAgcHJpbV9jb3VudCA9IHRvdGFsIC0gMjsgICAgIGJyZWFrOworICAgIGNhc2UgR0xfVFJJQU5HTEVfRkFOOiAgICAgICBwcmltX2NvdW50ID0gdG90YWwgLSAyOyAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9UUklBTkdMRVM6ICAgICAgICAgIHByaW1fY291bnQgPSB0b3RhbCAvIDM7ICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICByZXR1cm47CisgICAgfQorICAgIHByaW50ZiggInRvdGFsPSU1dSwgaGl0cz0lNXUsIG1pc3M9JTV1LCBoaXRyYXRlPSUzdSUlLCIKKyAgICAgICAgICAgICIgcHJpbXM9JTV1LCB0aW1lPSU2dSB1cywgcHJpbXMvcz0lZCwgdi90PSVmXG4iLAorICAgICAgICAgICAgdG90YWwsIGhpdHMsIG1pc3NlcywgKGhpdHMqMTAwKS90b3RhbCwKKyAgICAgICAgICAgIHByaW1fY291bnQsIGludChuczJ1cyh0aW1lKSksIGludChwcmltX2NvdW50KmZsb2F0KHNlY29uZHMoMSkpL3RpbWUpLAorICAgICAgICAgICAgZmxvYXQobWlzc2VzKSAvIHByaW1fY291bnQpOworI2VuZGlmCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAwCisjcHJhZ21hIG1hcmsgLQorI2VuZGlmCisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCit2b2lkIGVuYWJsZURpc2FibGVDbGllbnRTdGF0ZShvZ2xlc19jb250ZXh0X3QqIGMsIEdMZW51bSBhcnJheSwgYm9vbCBlbmFibGUpCit7CisgICAgY29uc3QgaW50IHRtdSA9IGMtPmFycmF5cy5hY3RpdmVUZXh0dXJlOworICAgIGFycmF5X3QqIGE7CisgICAgc3dpdGNoIChhcnJheSkgeworICAgIGNhc2UgR0xfQ09MT1JfQVJSQVk6ICAgICAgICAgICAgYSA9ICZjLT5hcnJheXMuY29sb3I7ICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX05PUk1BTF9BUlJBWTogICAgICAgICAgIGEgPSAmYy0+YXJyYXlzLm5vcm1hbDsgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZOiAgICBhID0gJmMtPmFycmF5cy50ZXh0dXJlW3RtdV07ICAgIGJyZWFrOworICAgIGNhc2UgR0xfVkVSVEVYX0FSUkFZOiAgICAgICAgICAgYSA9ICZjLT5hcnJheXMudmVydGV4OyAgICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGEtPmVuYWJsZSA9IGVuYWJsZSA/IEdMX1RSVUUgOiBHTF9GQUxTRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgVmVydGV4IENhY2hlCisjZW5kaWYKKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK3ZlcnRleF90KiBjYWNoZV92ZXJ0ZXgob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdiwgdWludDMyX3QgaW5kZXgpCit7CisgICAgI2lmIFZDX0NBQ0hFX1NUQVRJU1RJQ1MKKyAgICAgICAgYy0+dmMubWlzc2VzKys7CisgICAgI2VuZGlmCisgICAgaWYgKGdnbF91bmxpa2VseSh2LT5sb2NrZWQpKSB7CisgICAgICAgIC8vIHdlJ3JlIGp1c3QgbG9va2luZyBmb3IgYW4gZW50cnkgaW4gdGhlIGNhY2hlIHRoYXQgaXMgbm90IGxvY2tlZC4KKyAgICAgICAgLy8gYW5kIHdlIGtub3cgdGhhdCB0aGVyZSBjYW5ub3QgYmUgbW9yZSB0aGFuIDIgbG9ja2VkIGVudHJpZXMKKyAgICAgICAgLy8gYmVjYXVzZSBhIHRyaWFuZ2xlIG5lZWRzIGF0IG1vc3QgMyB2ZXJ0aWNlcy4KKyAgICAgICAgLy8gV2UgbmV2ZXIgdXNlIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGVudHJpZXMgYmVjYXVzZSB0aGV5IG1pZ2h0IGJlIGluCisgICAgICAgIC8vIHVzZSBieSB0aGUgc3RyaXBlciBvciBmYW5lci4gQW55IG90aGVyIGVudHJ5IHdpbGwgZG8gYXMgbG9uZyBhcworICAgICAgICAvLyBpdCdzIG5vdCBsb2NrZWQuCisgICAgICAgIC8vIFdlIGNvbXB1dGUgZGlyZWN0bHkgdGhlIGluZGV4IG9mIGEgImZyZWUiIGVudHJ5IGZyb20gdGhlIGxvY2tlZAorICAgICAgICAvLyBzdGF0ZSBvZiB2WzJdIGFuZCB2WzNdLgorICAgICAgICB2ID0gYy0+dmMudkJ1ZmZlciArIDI7CisgICAgICAgIHYgKz0gdlswXS5sb2NrZWQgfCAodlsxXS5sb2NrZWQ8PDEpOyAgICAgICAKKyAgICB9CisgICAgLy8gbm90ZTogY29tcGlsZUVsZW1lbnQgY2xlYXJzIHYtPmZsYWdzCisgICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50KGMsIHYsIGluZGV4KTsKKyAgICB2LT5sb2NrZWQgPSAxOworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQordmVydGV4X3QqIGZldGNoX3ZlcnRleChvZ2xlc19jb250ZXh0X3QqIGMsIHNpemVfdCBpbmRleCkKK3sKKyAgICBpbmRleCB8PSBjLT52Yy5zZXF1ZW5jZTsKKworI2lmIFZDX0NBQ0hFX1RZUEUgPT0gVkNfQ0FDSEVfVFlQRV9JTkRFWEVECisKKyAgICB2ZXJ0ZXhfdCogY29uc3QgdiA9IGMtPnZjLnZDYWNoZSArIAorICAgICAgICAgICAgKGluZGV4ICYgKHZlcnRleF9jYWNoZV90OjpWRVJURVhfQ0FDSEVfU0laRS0xKSk7CisKKyAgICBpZiAoZ2dsX2xpa2VseSh2LT5pbmRleCA9PSBpbmRleCkpIHsKKyAgICAgICAgdi0+bG9ja2VkID0gMTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorICAgIHJldHVybiBjYWNoZV92ZXJ0ZXgoYywgdiwgaW5kZXgpOworCisjZWxpZiBWQ19DQUNIRV9UWVBFID09IFZDX0NBQ0hFX1RZUEVfTFJVCisKKyAgICB2ZXJ0ZXhfdCogdiA9IGMtPnZjLnZDYWNoZSArIAorICAgICAgICAgICAgKGluZGV4ICYgKCh2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0NBQ0hFX1NJWkUtMSk+PjEpKSoyOworCisgICAgLy8gYWx3YXlzIHJlY29yZCBMUlUgaW4gdlswXQorICAgIGlmIChnZ2xfbGlrZWx5KHZbMF0uaW5kZXggPT0gaW5kZXgpKSB7CisgICAgICAgIHZbMF0ubG9ja2VkID0gMTsKKyAgICAgICAgdlswXS5tcnUgPSAwOworICAgICAgICByZXR1cm4gJnZbMF07CisgICAgfQorCisgICAgaWYgKGdnbF9saWtlbHkodlsxXS5pbmRleCA9PSBpbmRleCkpIHsKKyAgICAgICAgdlsxXS5sb2NrZWQgPSAxOworICAgICAgICB2WzBdLm1ydSA9IDE7CisgICAgICAgIHJldHVybiAmdlsxXTsKKyAgICB9CisKKyAgICBjb25zdCBpbnQgbHJ1ID0gMSAtIHZbMF0ubXJ1OworICAgIHZbMF0ubXJ1ID0gbHJ1OworICAgIHJldHVybiBjYWNoZV92ZXJ0ZXgoYywgJnZbbHJ1XSwgaW5kZXgpOworCisjZWxpZiBWQ19DQUNIRV9UWVBFID09IFZDX0NBQ0hFX1RZUEVfTk9ORQorCisgICAgLy8ganVzdCBmb3IgZGVidWdnaW5nLi4uCisgICAgdmVydGV4X3QqIHYgPSBjLT52Yy52QnVmZmVyICsgMjsKKyAgICByZXR1cm4gY2FjaGVfdmVydGV4KGMsIHYsIGluZGV4KTsKKworI2VuZGlmCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAwCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIFByaW1pdGl2ZSBBc3NlbWJseQorI2VuZGlmCisKK3ZvaWQgZHJhd1ByaW1pdGl2ZXNQb2ludHMob2dsZXNfY29udGV4dF90KiBjLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKK3sKKyAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMSkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIHZlcnRleCBjYWNoZSBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgMQorICAgIGNvbnN0IEdMc2l6ZWkgdmNzID0gCisgICAgICAgICAgICAodmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9CVUZGRVJfU0laRSArCisgICAgICAgICAgICAgdmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9DQUNIRV9TSVpFKTsKKyAgICBkbyB7CisgICAgICAgIHZlcnRleF90KiB2ID0gYy0+dmMudkJ1ZmZlcjsKKyAgICAgICAgR0xzaXplaSBudW0gPSBjb3VudCA+IHZjcyA/IHZjcyA6IGNvdW50OyAKKyAgICAgICAgYy0+YXJyYXlzLmN1bGwgPSB2ZXJ0ZXhfdDo6Q0xJUF9BTEw7CisgICAgICAgIGMtPmFycmF5cy5jb21waWxlRWxlbWVudHMoYywgdiwgZmlyc3QsIG51bSk7CisgICAgICAgIGZpcnN0ICs9IG51bTsKKyAgICAgICAgY291bnQgLT0gbnVtOworICAgICAgICBpZiAoIWMtPmFycmF5cy5jdWxsKSB7CisgICAgICAgICAgICAvLyBxdWljay90cml2aWFsIHJlamVjdCBvZiB0aGUgd2hvbGUgYmF0Y2gKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHZbMF0uZmxhZ3M7CisgICAgICAgICAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQorICAgICAgICAgICAgICAgICAgICBjLT5wcmltcy5yZW5kZXJQb2ludChjLCB2KTsKKyAgICAgICAgICAgICAgICB2Kys7CisgICAgICAgICAgICAgICAgbnVtLS07CisgICAgICAgICAgICB9IHdoaWxlIChudW0pOworICAgICAgICB9CisgICAgfSB3aGlsZSAoY291bnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgZHJhd1ByaW1pdGl2ZXNMaW5lU3RyaXAob2dsZXNfY29udGV4dF90KiBjLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKK3sKKyAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMikpCisgICAgICAgIHJldHVybjsKKworICAgIHZlcnRleF90ICp2LCAqdjAsICp2MTsKKyAgICBjLT5hcnJheXMuY3VsbCA9IHZlcnRleF90OjpDTElQX0FMTDsKKyAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnQoYywgYy0+dmMudkJ1ZmZlciwgZmlyc3QpOworICAgIGZpcnN0ICs9IDE7CisgICAgY291bnQgLT0gMTsKKworICAgIC8vIHZlcnRleCBjYWNoZSBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgMQorICAgIGNvbnN0IEdMc2l6ZWkgdmNzID0gCisgICAgICAgICh2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0JVRkZFUl9TSVpFICsKKyAgICAgICAgIHZlcnRleF9jYWNoZV90OjpWRVJURVhfQ0FDSEVfU0laRSAtIDEpOworICAgIGRvIHsKKyAgICAgICAgdjAgPSBjLT52Yy52QnVmZmVyICsgMDsgCisgICAgICAgIHYgID0gYy0+dmMudkJ1ZmZlciArIDE7CisgICAgICAgIEdMc2l6ZWkgbnVtID0gY291bnQgPiB2Y3MgPyB2Y3MgOiBjb3VudDsgCisgICAgICAgIGMtPmFycmF5cy5jb21waWxlRWxlbWVudHMoYywgdiwgZmlyc3QsIG51bSk7CisgICAgICAgIGZpcnN0ICs9IG51bTsKKyAgICAgICAgY291bnQgLT0gbnVtOworICAgICAgICBpZiAoIWMtPmFycmF5cy5jdWxsKSB7CisgICAgICAgICAgICAvLyBxdWljay90cml2aWFsIHJlamVjdCBvZiB0aGUgd2hvbGUgYmF0Y2gKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB2MSA9IHYrKzsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHYwLT5mbGFncyAmIHYxLT5mbGFnczsKKyAgICAgICAgICAgICAgICBpZiAoZ2dsX2xpa2VseSghKGNjICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkpCisgICAgICAgICAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlckxpbmUoYywgdjAsIHYxKTsKKyAgICAgICAgICAgICAgICB2MCA9IHYxOworICAgICAgICAgICAgICAgIG51bS0tOworICAgICAgICAgICAgfSB3aGlsZSAobnVtKTsKKyAgICAgICAgfQorICAgICAgICAvLyBjb3B5IGJhY2sgdGhlIGxhc3QgcHJvY2Vzc2VkIHZlcnRleAorICAgICAgICBjLT52Yy52QnVmZmVyWzBdID0gKnYwOworICAgICAgICBjLT5hcnJheXMuY3VsbCA9IHYwLT5mbGFncyAmIHZlcnRleF90OjpDTElQX0FMTDsKKyAgICB9IHdoaWxlIChjb3VudCk7Cit9CisKK3ZvaWQgZHJhd1ByaW1pdGl2ZXNMaW5lTG9vcChvZ2xlc19jb250ZXh0X3QqIGMsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KQoreworICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPCAyKSkKKyAgICAgICAgcmV0dXJuOworICAgIGRyYXdQcmltaXRpdmVzTGluZVN0cmlwKGMsIGZpcnN0LCBjb3VudCk7CisgICAgaWYgKGdnbF9saWtlbHkoY291bnQgPj0gMykpIHsKKyAgICAgICAgdmVydGV4X3QqIHYwID0gYy0+dmMudkJ1ZmZlcjsgCisgICAgICAgIHZlcnRleF90KiB2MSA9IGMtPnZjLnZCdWZmZXIgKyAxOworICAgICAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnQoYywgdjEsIGZpcnN0KTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgY2MgPSB2MC0+ZmxhZ3MgJiB2MS0+ZmxhZ3M7CisgICAgICAgIGlmIChnZ2xfbGlrZWx5KCEoY2MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKKyAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlckxpbmUoYywgdjAsIHYxKTsKKyAgICB9Cit9CisKK3ZvaWQgZHJhd1ByaW1pdGl2ZXNMaW5lcyhvZ2xlc19jb250ZXh0X3QqIGMsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KQoreworICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPCAyKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gdmVydGV4IGNhY2hlIHNpemUgbXVzdCBiZSBtdWx0aXBsZSBvZiAyCisgICAgY29uc3QgR0xzaXplaSB2Y3MgPSAKKyAgICAgICAgKCh2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0JVRkZFUl9TSVpFICsKKyAgICAgICAgdmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9DQUNIRV9TSVpFKSAvIDIpICogMjsKKyAgICBkbyB7CisgICAgICAgIHZlcnRleF90KiB2ID0gYy0+dmMudkJ1ZmZlcjsKKyAgICAgICAgR0xzaXplaSBudW0gPSBjb3VudCA+IHZjcyA/IHZjcyA6IGNvdW50OyAKKyAgICAgICAgYy0+YXJyYXlzLmN1bGwgPSB2ZXJ0ZXhfdDo6Q0xJUF9BTEw7CisgICAgICAgIGMtPmFycmF5cy5jb21waWxlRWxlbWVudHMoYywgdiwgZmlyc3QsIG51bSk7CisgICAgICAgIGZpcnN0ICs9IG51bTsKKyAgICAgICAgY291bnQgLT0gbnVtOworICAgICAgICBpZiAoIWMtPmFycmF5cy5jdWxsKSB7CisgICAgICAgICAgICAvLyBxdWljay90cml2aWFsIHJlamVjdCBvZiB0aGUgd2hvbGUgYmF0Y2gKKyAgICAgICAgICAgIG51bSAtPSAyOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdlswXS5mbGFncyAmIHZbMV0uZmxhZ3M7CisgICAgICAgICAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQorICAgICAgICAgICAgICAgICAgICBjLT5wcmltcy5yZW5kZXJMaW5lKGMsIHYsIHYrMSk7CisgICAgICAgICAgICAgICAgdiArPSAyOworICAgICAgICAgICAgICAgIG51bSAtPSAyOworICAgICAgICAgICAgfSB3aGlsZSAobnVtID49IDApOworICAgICAgICB9CisgICAgfSB3aGlsZSAoY291bnQgPj0gMik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgZHJhd1ByaW1pdGl2ZXNUcmlhbmdsZUZhbk9yU3RyaXAob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgaW50IHdpbmRpbmcpCit7CisgICAgLy8gd2luZGluZyA9PSAyIDogZmFuCisgICAgLy8gd2luZGluZyA9PSAxIDogc3RyaXAKKworICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPCAzKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgdmVydGV4X3QgKnYsICp2MCwgKnYxLCAqdjI7CisgICAgYy0+YXJyYXlzLmN1bGwgPSB2ZXJ0ZXhfdDo6Q0xJUF9BTEw7CisgICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50cyhjLCBjLT52Yy52QnVmZmVyLCBmaXJzdCwgMik7CisgICAgZmlyc3QgKz0gMjsKKyAgICBjb3VudCAtPSAyOworCisgICAgLy8gdmVydGV4IGNhY2hlIHNpemUgbXVzdCBiZSBtdWx0aXBsZSBvZiAyLiBUaGlzIGlzIGV4dHJlbWVseSBpbXBvcnRhbnQKKyAgICAvLyBiZWNhdXNlIGl0IGFsbG93cyB1cyB0byBwcmVzZXJ2ZSB0aGUgc2FtZSB3aW5kaW5nIHdoZW4gdGhlIHdob2xlCisgICAgLy8gYmF0Y2ggaXMgY3VsbGVkLiBXZSBhbHNvIG5lZWQgMiBleHRyYSB2ZXJ0aWNlcyBpbiB0aGUgYXJyYXksIGJlY2F1c2UKKyAgICAvLyB3ZSBhbHdheXMga2VlcCB0aGUgdHdvIGZpcnN0IG9uZXMuCisgICAgY29uc3QgR0xzaXplaSB2Y3MgPSAKKyAgICAgICAgKCh2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0JVRkZFUl9TSVpFICsKKyAgICAgICAgICB2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0NBQ0hFX1NJWkUgLSAyKSAvIDIpICogMjsKKyAgICBkbyB7CisgICAgICAgIHYwID0gYy0+dmMudkJ1ZmZlciArIDA7IAorICAgICAgICB2MSA9IGMtPnZjLnZCdWZmZXIgKyAxOyAKKyAgICAgICAgdiAgPSBjLT52Yy52QnVmZmVyICsgMjsKKyAgICAgICAgR0xzaXplaSBudW0gPSBjb3VudCA+IHZjcyA/IHZjcyA6IGNvdW50OyAKKyAgICAgICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50cyhjLCB2LCBmaXJzdCwgbnVtKTsKKyAgICAgICAgZmlyc3QgKz0gbnVtOworICAgICAgICBjb3VudCAtPSBudW07CisgICAgICAgIGlmICghYy0+YXJyYXlzLmN1bGwpIHsKKyAgICAgICAgICAgIC8vIHF1aWNrL3RyaXZpYWwgcmVqZWN0IG9mIHRoZSB3aG9sZSBiYXRjaAorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHYyID0gdisrOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzICYgdjItPmZsYWdzOworICAgICAgICAgICAgICAgIGlmIChnZ2xfbGlrZWx5KCEoY2MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKKyAgICAgICAgICAgICAgICAgICAgYy0+cHJpbXMucmVuZGVyVHJpYW5nbGUoYywgdjAsIHYxLCB2Mik7CisgICAgICAgICAgICAgICAgc3dhcCgoKHdpbmRpbmdePTEpID8gdjEgOiB2MCksIHYyKTsKKyAgICAgICAgICAgICAgICBudW0tLTsKKyAgICAgICAgICAgIH0gd2hpbGUgKG51bSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvdW50KSB7CisgICAgICAgICAgICB2MCA9IGMtPnZjLnZCdWZmZXIgKyAyICsgbnVtIC0gMjsKKyAgICAgICAgICAgIHYxID0gYy0+dmMudkJ1ZmZlciArIDIgKyBudW0gLSAxOworICAgICAgICAgICAgaWYgKCh3aW5kaW5nJjIpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBmb3Igc3RyaXBzIGNvcHkgYmFjayB0aGUgdHdvIGxhc3QgY29tcGlsZWQgdmVydGljZXMKKyAgICAgICAgICAgICAgICBjLT52Yy52QnVmZmVyWzBdID0gKnYwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy0+dmMudkJ1ZmZlclsxXSA9ICp2MTsKKyAgICAgICAgICAgIGMtPmFycmF5cy5jdWxsID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzICYgdmVydGV4X3Q6OkNMSVBfQUxMOworICAgICAgICB9CisgICAgfSB3aGlsZSAoY291bnQgPiAwKTsKK30KKwordm9pZCBkcmF3UHJpbWl0aXZlc1RyaWFuZ2xlU3RyaXAob2dsZXNfY29udGV4dF90KiBjLCAKKyAgICAgICAgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpIHsKKyAgICBkcmF3UHJpbWl0aXZlc1RyaWFuZ2xlRmFuT3JTdHJpcChjLCBmaXJzdCwgY291bnQsIDEpOworfQorCit2b2lkIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVGYW4ob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkgeworICAgIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVGYW5PclN0cmlwKGMsIGZpcnN0LCBjb3VudCwgMik7Cit9CisKK3ZvaWQgZHJhd1ByaW1pdGl2ZXNUcmlhbmdsZXMob2dsZXNfY29udGV4dF90KiBjLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKK3sKKyAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMykpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIHZlcnRleCBjYWNoZSBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgMworICAgIGNvbnN0IEdMc2l6ZWkgdmNzID0gCisgICAgICAgICgodmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9CVUZGRVJfU0laRSArCisgICAgICAgIHZlcnRleF9jYWNoZV90OjpWRVJURVhfQ0FDSEVfU0laRSkgLyAzKSAqIDM7CisgICAgZG8geworICAgICAgICB2ZXJ0ZXhfdCogdiA9IGMtPnZjLnZCdWZmZXI7CisgICAgICAgIEdMc2l6ZWkgbnVtID0gY291bnQgPiB2Y3MgPyB2Y3MgOiBjb3VudDsgCisgICAgICAgIGMtPmFycmF5cy5jdWxsID0gdmVydGV4X3Q6OkNMSVBfQUxMOworICAgICAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnRzKGMsIHYsIGZpcnN0LCBudW0pOworICAgICAgICBmaXJzdCArPSBudW07CisgICAgICAgIGNvdW50IC09IG51bTsKKyAgICAgICAgaWYgKCFjLT5hcnJheXMuY3VsbCkgeworICAgICAgICAgICAgLy8gcXVpY2svdHJpdmlhbCByZWplY3Qgb2YgdGhlIHdob2xlIGJhdGNoCisgICAgICAgICAgICBudW0gLT0gMzsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHZbMF0uZmxhZ3MgJiB2WzFdLmZsYWdzICYgdlsyXS5mbGFnczsKKyAgICAgICAgICAgICAgICBpZiAoZ2dsX2xpa2VseSghKGNjICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkpCisgICAgICAgICAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlclRyaWFuZ2xlKGMsIHYsIHYrMSwgdisyKTsKKyAgICAgICAgICAgICAgICB2ICs9IDM7CisgICAgICAgICAgICAgICAgbnVtIC09IDM7CisgICAgICAgICAgICB9IHdoaWxlIChudW0gPj0gMCk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChjb3VudCA+PSAzKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjZW5kaWYKKworLy8gdGhpcyBsb29rcyBnb29meSwgYnV0IGdjYyBkb2VzIGEgZ3JlYXQgam9iIHdpdGggdGhpcy4uLgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcmVhZF9pbmRleChpbnQgdHlwZSwgY29uc3QgR0x2b2lkKiYgcCkgeworICAgIHVuc2lnbmVkIGludCByOworICAgIGlmICh0eXBlKSB7CisgICAgICAgIHIgPSAqKGNvbnN0IEdMdWJ5dGUqKXA7CisgICAgICAgIHAgPSAoY29uc3QgR0x1Ynl0ZSopcCArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgciA9ICooY29uc3QgR0x1c2hvcnQqKXA7CisgICAgICAgIHAgPSAoY29uc3QgR0x1c2hvcnQqKXAgKyAxOworICAgIH0KKyAgICByZXR1cm4gcjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1BvaW50cyhvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcykKK3sKKyAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMSkpCisgICAgICAgIHJldHVybjsKKyAgICBjb25zdCBpbnQgdHlwZSA9IChjLT5hcnJheXMuaW5kaWNlc1R5cGUgPT0gR0xfVU5TSUdORURfQllURSk7CisgICAgZG8geworICAgICAgICB2ZXJ0ZXhfdCAqIHYgPSBmZXRjaF92ZXJ0ZXgoYywgcmVhZF9pbmRleCh0eXBlLCBpbmRpY2VzKSk7CisgICAgICAgIGlmIChnZ2xfbGlrZWx5KCEodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKKyAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlclBvaW50KGMsIHYpOworICAgICAgICB2LT5sb2NrZWQgPSAwOworICAgICAgICBjb3VudC0tOworICAgIH0gd2hpbGUoY291bnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZVN0cmlwKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICppbmRpY2VzKQoreworICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPCAyKSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIHZlcnRleF90ICogY29uc3QgdiA9IGMtPnZjLnZCdWZmZXI7CisgICAgdmVydGV4X3QqIHYwID0gdjsKKyAgICB2ZXJ0ZXhfdCogdjE7CisgICAgCisgICAgY29uc3QgaW50IHR5cGUgPSAoYy0+YXJyYXlzLmluZGljZXNUeXBlID09IEdMX1VOU0lHTkVEX0JZVEUpOworICAgIGMtPmFycmF5cy5jb21waWxlRWxlbWVudChjLCB2MCwgcmVhZF9pbmRleCh0eXBlLCBpbmRpY2VzKSk7CisgICAgY291bnQgLT0gMTsKKyAgICBkbyB7CisgICAgICAgIHYxID0gZmV0Y2hfdmVydGV4KGMsIHJlYWRfaW5kZXgodHlwZSwgaW5kaWNlcykpOworICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHYwLT5mbGFncyAmIHYxLT5mbGFnczsKKyAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQorICAgICAgICAgICAgYy0+cHJpbXMucmVuZGVyTGluZShjLCB2MCwgdjEpOworICAgICAgICB2MC0+bG9ja2VkID0gMDsKKyAgICAgICAgdjAgPSB2MTsKKyAgICAgICAgY291bnQtLTsKKyAgICB9IHdoaWxlIChjb3VudCk7CisgICAgdjEtPmxvY2tlZCA9IDA7Cit9CisKK3ZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZUxvb3Aob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKmluZGljZXMpCit7CisgICAgaWYgKGdnbF91bmxpa2VseShjb3VudCA8PSAyKSkgeworICAgICAgICBkcmF3SW5kZXhlZFByaW1pdGl2ZXNMaW5lcyhjLCBjb3VudCwgaW5kaWNlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgCisgICAgdmVydGV4X3QgKiBjb25zdCB2ID0gYy0+dmMudkJ1ZmZlcjsKKyAgICB2ZXJ0ZXhfdCogdjAgPSB2OworICAgIHZlcnRleF90KiB2MTsKKyAgICAKKyAgICBjb25zdCBpbnQgdHlwZSA9IChjLT5hcnJheXMuaW5kaWNlc1R5cGUgPT0gR0xfVU5TSUdORURfQllURSk7CisgICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50KGMsIHYwLCByZWFkX2luZGV4KHR5cGUsIGluZGljZXMpKTsKKyAgICBjb3VudCAtPSAxOworICAgIGRvIHsKKyAgICAgICAgdjEgPSBmZXRjaF92ZXJ0ZXgoYywgcmVhZF9pbmRleCh0eXBlLCBpbmRpY2VzKSk7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzOworICAgICAgICBpZiAoZ2dsX2xpa2VseSghKGNjICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkpCisgICAgICAgICAgICBjLT5wcmltcy5yZW5kZXJMaW5lKGMsIHYwLCB2MSk7CisgICAgICAgIHYwLT5sb2NrZWQgPSAwOworICAgICAgICB2MCA9IHYxOworICAgICAgICBjb3VudC0tOworICAgIH0gd2hpbGUgKGNvdW50KTsKKyAgICB2MS0+bG9ja2VkID0gMDsKKworICAgIHYxID0gYy0+dmMudkJ1ZmZlcjsgCisgICAgY29uc3QgdWludDMyX3QgY2MgPSB2MC0+ZmxhZ3MgJiB2MS0+ZmxhZ3M7CisgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQorICAgICAgICBjLT5wcmltcy5yZW5kZXJMaW5lKGMsIHYwLCB2MSk7Cit9CisKK3ZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZXMob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKmluZGljZXMpCit7CisgICAgaWYgKGdnbF91bmxpa2VseShjb3VudCA8IDIpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb3VudCAtPSAyOworICAgIGNvbnN0IGludCB0eXBlID0gKGMtPmFycmF5cy5pbmRpY2VzVHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKTsKKyAgICBkbyB7CisgICAgICAgIHZlcnRleF90KiBjb25zdCB2MCA9IGZldGNoX3ZlcnRleChjLCByZWFkX2luZGV4KHR5cGUsIGluZGljZXMpKTsKKyAgICAgICAgdmVydGV4X3QqIGNvbnN0IHYxID0gZmV0Y2hfdmVydGV4KGMsIHJlYWRfaW5kZXgodHlwZSwgaW5kaWNlcykpOworICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHYwLT5mbGFncyAmIHYxLT5mbGFnczsKKyAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQorICAgICAgICAgICAgYy0+cHJpbXMucmVuZGVyTGluZShjLCB2MCwgdjEpOworICAgICAgICB2MC0+bG9ja2VkID0gMDsKKyAgICAgICAgdjEtPmxvY2tlZCA9IDA7CisgICAgICAgIGNvdW50IC09IDI7CisgICAgfSB3aGlsZSAoY291bnQgPj0gMCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzVHJpYW5nbGVGYW5PclN0cmlwKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICppbmRpY2VzLCBpbnQgd2luZGluZykKK3sKKyAgICAvLyB3aW5kaW5nID09IDIgOiBmYW4KKyAgICAvLyB3aW5kaW5nID09IDEgOiBzdHJpcAorCisgICAgaWYgKGdnbF91bmxpa2VseShjb3VudCA8IDMpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgdmVydGV4X3QgKiBjb25zdCB2ID0gYy0+dmMudkJ1ZmZlcjsKKyAgICB2ZXJ0ZXhfdCogdjAgPSB2OworICAgIHZlcnRleF90KiB2MSA9IHYrMTsKKyAgICB2ZXJ0ZXhfdCogdjI7CisKKyAgICBjb25zdCBpbnQgdHlwZSA9IChjLT5hcnJheXMuaW5kaWNlc1R5cGUgPT0gR0xfVU5TSUdORURfQllURSk7CisgICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50KGMsIHYwLCByZWFkX2luZGV4KHR5cGUsIGluZGljZXMpKTsKKyAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnQoYywgdjEsIHJlYWRfaW5kZXgodHlwZSwgaW5kaWNlcykpOworICAgIGNvdW50IC09IDI7CisKKyAgICAvLyBub3RlOiBHQ0MgNC4xLjEgaGVyZSBtYWtlcyBhIHByZXR5IGludGVyZXN0aW5nIG9wdGltaXphdGlvbgorICAgIC8vIHdoZXJlIGl0IGR1cGxpY2F0ZXMgdGhlIGxvb3AgYmVsb3cgYmFzZWQgb24gYy0+YXJyYXlzLmluZGljZXNUeXBlCisKKyAgICBkbyB7CisgICAgICAgIHYyID0gZmV0Y2hfdmVydGV4KGMsIHJlYWRfaW5kZXgodHlwZSwgaW5kaWNlcykpOworICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHYwLT5mbGFncyAmIHYxLT5mbGFncyAmIHYyLT5mbGFnczsKKyAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQorICAgICAgICAgICAgYy0+cHJpbXMucmVuZGVyVHJpYW5nbGUoYywgdjAsIHYxLCB2Mik7CisgICAgICAgIHZlcnRleF90KiAmIGNvbnN1bWVkID0gKCh3aW5kaW5nXj0xKSA/IHYxIDogdjApOworICAgICAgICBjb25zdW1lZC0+bG9ja2VkID0gMDsKKyAgICAgICAgY29uc3VtZWQgPSB2MjsKKyAgICAgICAgY291bnQtLTsKKyAgICB9IHdoaWxlIChjb3VudCk7CisgICAgdjAtPmxvY2tlZCA9IHYxLT5sb2NrZWQgPSAwOworICAgIHYyLT5sb2NrZWQgPSAwOworfQorCit2b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlU3RyaXAob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKmluZGljZXMpIHsKKyAgICBkcmF3SW5kZXhlZFByaW1pdGl2ZXNUcmlhbmdsZUZhbk9yU3RyaXAoYywgY291bnQsIGluZGljZXMsIDEpOworfQorCit2b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlRmFuKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICppbmRpY2VzKSB7CisgICAgZHJhd0luZGV4ZWRQcmltaXRpdmVzVHJpYW5nbGVGYW5PclN0cmlwKGMsIGNvdW50LCBpbmRpY2VzLCAyKTsKK30KKwordm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNUcmlhbmdsZXMob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKmluZGljZXMpCit7CisgICAgaWYgKGdnbF91bmxpa2VseShjb3VudCA8IDMpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb3VudCAtPSAzOworICAgIGlmIChnZ2xfbGlrZWx5KGMtPmFycmF5cy5pbmRpY2VzVHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVCkpIHsKKyAgICAgICAgLy8gVGhpcyBjYXNlIGlzIHByb2JhYmx5IG91ciBtb3N0IGNvbW1vbiBjYXNlLi4uCisgICAgICAgIHVpbnQxNl90IGNvbnN0ICogcCA9ICh1aW50MTZfdCBjb25zdCAqKWluZGljZXM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MCA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKKyAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MSA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKKyAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MiA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzICYgdjItPmZsYWdzOworICAgICAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQorICAgICAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlclRyaWFuZ2xlKGMsIHYwLCB2MSwgdjIpOworICAgICAgICAgICAgdjAtPmxvY2tlZCA9IDA7CisgICAgICAgICAgICB2MS0+bG9ja2VkID0gMDsKKyAgICAgICAgICAgIHYyLT5sb2NrZWQgPSAwOworICAgICAgICAgICAgY291bnQgLT0gMzsKKyAgICAgICAgfSB3aGlsZSAoY291bnQgPj0gMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDhfdCBjb25zdCAqIHAgPSAodWludDhfdCBjb25zdCAqKWluZGljZXM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MCA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKKyAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MSA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKKyAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2MiA9IGZldGNoX3ZlcnRleChjLCAqcCsrKTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzICYgdjItPmZsYWdzOworICAgICAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQorICAgICAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlclRyaWFuZ2xlKGMsIHYwLCB2MSwgdjIpOworICAgICAgICAgICAgdjAtPmxvY2tlZCA9IDA7CisgICAgICAgICAgICB2MS0+bG9ja2VkID0gMDsKKyAgICAgICAgICAgIHYyLT5sb2NrZWQgPSAwOworICAgICAgICAgICAgY291bnQgLT0gMzsKKyAgICAgICAgfSB3aGlsZSAoY291bnQgPj0gMCk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBBcnJheSBjb21waWxlcnMKKyNlbmRpZgorCit2b2lkIGNvbXBpbGVFbGVtZW50X19nZW5lcmljKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgdmVydGV4X3QqIHYsIEdMaW50IGZpcnN0KQoreworICAgIHYtPmZsYWdzID0gMDsKKyAgICB2LT5pbmRleCA9IGZpcnN0OworICAgIGZpcnN0ICY9IHZlcnRleF9jYWNoZV90OjpJTkRFWF9NQVNLOworICAgIGNvbnN0IEdMdWJ5dGUqIHZwID0gYy0+YXJyYXlzLnZlcnRleC5lbGVtZW50KGZpcnN0KTsKKyAgICBjLT5hcnJheXMudmVydGV4LmZldGNoKGMsIHYtPm9iai52LCB2cCk7CisgICAgYy0+YXJyYXlzLm12cF90cmFuc2Zvcm0oJmMtPnRyYW5zZm9ybXMubXZwLCAmdi0+Y2xpcCwgJnYtPm9iaik7CisgICAgYy0+YXJyYXlzLnBlcnNwZWN0aXZlKGMsIHYpOworfQorCit2b2lkIGNvbXBpbGVFbGVtZW50c19fZ2VuZXJpYyhvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2LCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKK3sKKyAgICBjb25zdCBHTHVieXRlKiB2cCA9IGMtPmFycmF5cy52ZXJ0ZXguZWxlbWVudCgKKyAgICAgICAgICAgIGZpcnN0ICYgdmVydGV4X2NhY2hlX3Q6OklOREVYX01BU0spOworICAgIGNvbnN0IHNpemVfdCBzdHJpZGUgPSBjLT5hcnJheXMudmVydGV4LnN0cmlkZTsKKyAgICB0cmFuc2Zvcm1fdCBjb25zdCogY29uc3QgbXZwID0gJmMtPnRyYW5zZm9ybXMubXZwOworICAgIGRvIHsKKyAgICAgICAgdi0+ZmxhZ3MgPSAwOworICAgICAgICB2LT5pbmRleCA9IGZpcnN0Kys7CisgICAgICAgIGMtPmFycmF5cy52ZXJ0ZXguZmV0Y2goYywgdi0+b2JqLnYsIHZwKTsKKyAgICAgICAgYy0+YXJyYXlzLm12cF90cmFuc2Zvcm0obXZwLCAmdi0+Y2xpcCwgJnYtPm9iaik7CisgICAgICAgIGMtPmFycmF5cy5wZXJzcGVjdGl2ZShjLCB2KTsKKyAgICAgICAgdnAgKz0gc3RyaWRlOworICAgICAgICB2Kys7CisgICAgfSB3aGlsZSAoLS1jb3VudCk7Cit9CisKKy8qCit2b2lkIGNvbXBpbGVFbGVtZW50c19fM3hfZnVsbChvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2LCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKK3sKKyAgICBjb25zdCBHTGZpeGVkKiB2cCA9IChjb25zdCBHTGZpeGVkKiljLT5hcnJheXMudmVydGV4LmVsZW1lbnQoZmlyc3QpOworICAgIGNvbnN0IHNpemVfdCBzdHJpZGUgPSBjLT5hcnJheXMudmVydGV4LnN0cmlkZSAvIDQ7CisvLyAgICBjb25zdCBHTGZpeGVkKiBjb25zdCYgbSA9IGMtPnRyYW5zZm9ybXMubXZwLm1hdHJpeC5tOworICAgIAorICAgIEdMZml4ZWQgbVsxNl07CisgICAgbWVtY3B5KCZtLCBjLT50cmFuc2Zvcm1zLm12cC5tYXRyaXgubSwgc2l6ZW9mKG0pKTsKKyAgICAKKyAgICBkbyB7CisgICAgICAgIGNvbnN0IEdMZml4ZWQgcnggPSB2cFswXTsKKyAgICAgICAgY29uc3QgR0xmaXhlZCByeSA9IHZwWzFdOworICAgICAgICBjb25zdCBHTGZpeGVkIHJ6ID0gdnBbMl07CisgICAgICAgIHZwICs9IHN0cmlkZTsKKyAgICAgICAgdi0+aW5kZXggPSBmaXJzdCsrOworICAgICAgICB2LT5jbGlwLnggPSBtbGEzYShyeCwgbVsgMF0sIHJ5LCBtWyA0XSwgcnosIG1bIDhdLCBtWzEyXSk7IAorICAgICAgICB2LT5jbGlwLnkgPSBtbGEzYShyeCwgbVsgMV0sIHJ5LCBtWyA1XSwgcnosIG1bIDldLCBtWzEzXSk7CisgICAgICAgIHYtPmNsaXAueiA9IG1sYTNhKHJ4LCBtWyAyXSwgcnksIG1bIDZdLCByeiwgbVsxMF0sIG1bMTRdKTsKKyAgICAgICAgdi0+Y2xpcC53ID0gbWxhM2EocngsIG1bIDNdLCByeSwgbVsgN10sIHJ6LCBtWzExXSwgbVsxNV0pOworCisgICAgICAgIGNvbnN0IEdMZml4ZWQgdyA9IHYtPmNsaXAudzsKKyAgICAgICAgdWludDMyX3QgY2xpcCA9IDA7CisgICAgICAgIGlmICh2LT5jbGlwLnggPCAtdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX0w7CisgICAgICAgIGlmICh2LT5jbGlwLnggPiAgdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX1I7CisgICAgICAgIGlmICh2LT5jbGlwLnkgPCAtdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX0I7CisgICAgICAgIGlmICh2LT5jbGlwLnkgPiAgdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX1Q7CisgICAgICAgIGlmICh2LT5jbGlwLnogPCAtdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX047CisgICAgICAgIGlmICh2LT5jbGlwLnogPiAgdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX0Y7CisgICAgICAgIHYtPmZsYWdzID0gY2xpcDsKKyAgICAgICAgYy0+YXJyYXlzLmN1bGwgJj0gY2xpcDsKKworICAgICAgICAvL2MtPmFycmF5cy5wZXJzcGVjdGl2ZShjLCB2KTsKKyAgICAgICAgdisrOworICAgIH0gd2hpbGUgKC0tY291bnQpOworfQorKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgY2xpcHBlcnMKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjbGlwVmVjNCh2ZWM0X3QmIG52LCAKKyAgICAgICAgR0xmaXhlZCB0LCBjb25zdCB2ZWM0X3QmIHMsIGNvbnN0IHZlYzRfdCYgcCkKK3sKKyAgICBmb3IgKGludCBpPTA7IGk8NCA7IGkrKykKKyAgICAgICAgbnYudltpXSA9IGdnbE11bEFkZHgodCwgcy52W2ldIC0gcC52W2ldLCBwLnZbaV0sIDI4KTsKK30KKworc3RhdGljIHZvaWQgY2xpcFZlcnRleChvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiBudiwKKyAgICAgICAgR0xmaXhlZCB0LCBjb25zdCB2ZXJ0ZXhfdCogcywgY29uc3QgdmVydGV4X3QqIHApCit7CisgICAgY2xpcFZlYzQobnYtPmNsaXAsIHQsIHMtPmNsaXAsIHAtPmNsaXApOworICAgIG52LT5mb2cgPSBnZ2xNdWxBZGR4KHQsIHMtPmZvZyAtIHAtPmZvZywgcC0+Zm9nLCAyOCk7CisgICAgb2dsZXNfdmVydGV4X3Byb2plY3QoYywgbnYpOworICAgIG52LT5mbGFncyB8PSAgdmVydGV4X3Q6OkxJVCB8IHZlcnRleF90OjpFWUUgfCB2ZXJ0ZXhfdDo6VFQ7CisgICAgbnYtPmZsYWdzICY9IH52ZXJ0ZXhfdDo6Q0xJUF9BTEw7Cit9CisKK3N0YXRpYyB2b2lkIGNsaXBWZXJ0ZXhDKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIG52LAorICAgICAgICBHTGZpeGVkIHQsIGNvbnN0IHZlcnRleF90KiBzLCBjb25zdCB2ZXJ0ZXhfdCogcCkKK3sKKyAgICBjbGlwVmVjNChudi0+Y29sb3IsIHQsIHMtPmNvbG9yLCBwLT5jb2xvcik7CisgICAgY2xpcFZlcnRleChjLCBudiwgdCwgcywgcCk7Cit9CisKK3N0YXRpYyB2b2lkIGNsaXBWZXJ0ZXhUKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIG52LAorICAgICAgICBHTGZpeGVkIHQsIGNvbnN0IHZlcnRleF90KiBzLCBjb25zdCB2ZXJ0ZXhfdCogcCkKK3sKKyAgICBmb3IgKGludCBpPTAgOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKKyAgICAgICAgaWYgKGMtPnJhc3Rlcml6ZXIuc3RhdGUudGV4dHVyZVtpXS5lbmFibGUpCisgICAgICAgICAgICBjbGlwVmVjNChudi0+dGV4dHVyZVtpXSwgdCwgcy0+dGV4dHVyZVtpXSwgcC0+dGV4dHVyZVtpXSk7CisgICAgfQorICAgIGNsaXBWZXJ0ZXgoYywgbnYsIHQsIHMsIHApOworfQorCitzdGF0aWMgdm9pZCBjbGlwVmVydGV4QWxsKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIG52LAorICAgICAgICBHTGZpeGVkIHQsIGNvbnN0IHZlcnRleF90KiBzLCBjb25zdCB2ZXJ0ZXhfdCogcCkKK3sKKyAgICBjbGlwVmVjNChudi0+Y29sb3IsIHQsIHMtPmNvbG9yLCBwLT5jb2xvcik7CisgICAgY2xpcFZlcnRleFQoYywgbnYsIHQsIHMsIHApOworfQorCitzdGF0aWMgdm9pZCBjbGlwRXllKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIG52LAorICAgICAgICBHTGZpeGVkIHQsIGNvbnN0IHZlcnRleF90KiBzLCBjb25zdCB2ZXJ0ZXhfdCogcCkKK3sKKyAgICBudi0+Y2xlYXIoKTsKKyAgICBjLT5hcnJheXMuY2xpcFZlcnRleChjLCBudiwgdCwgcCwgcyk7CisgICAgY2xpcFZlYzQobnYtPmV5ZSwgdCwgcy0+ZXllLCBwLT5leWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNlbmRpZgorCit2b2lkIHZhbGlkYXRlX2FycmF5cyhvZ2xlc19jb250ZXh0X3QqIGMsIEdMZW51bSBtb2RlKQoreworICAgIHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7CisKKyAgICAvLyBQZXJzcGVjdGl2ZSBjb3JyZWN0aW9uIGlzIG5vdCBuZWVkIGlmIE9ydGhvIHRyYW5zZm9ybSwgYnV0CisgICAgLy8gdGhlIHVzZXIgY2FuIHN0aWxsIHByb3ZpZGUgdGhlIHcgY29vcmRpbmF0ZSBtYW51YWxseSwgc28gd2UgY2FuJ3QKKyAgICAvLyBhdXRvbWF0aWNhbGx5IHR1cm4gaXQgb2ZmIChpbiBmYWN0IHdlIGNvdWxkIHdoZW4gdGhlIDR0aCBjb29yZGluYXRlCisgICAgLy8gaXMgbm90IHNwY2lmaWVkIGluIHRoZSB2ZXJ0ZXggYXJyYXkpLgorICAgIC8vIFcgaW50ZXJwb2xhdGlvbiBpcyBuZXZlciBuZWVkZWQgZm9yIHBvaW50cy4KKyAgICBHTGJvb2xlYW4gcGVyc3BlY3RpdmUgPSAKKyAgICAgICAgYy0+cGVyc3BlY3RpdmUgJiYgbW9kZSE9R0xfUE9JTlRTICYmIChlbmFibGVzICYgR0dMX0VOQUJMRV9UTVVTKTsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmVuYWJsZURpc2FibGUoYywgR0dMX1dfTEVSUCwgcGVyc3BlY3RpdmUpOworICAgIAorICAgIC8vIHNldCBhbnRpLWFsaWFzaW5nCisgICAgR0xib29sZWFuIHNtb290aCA9IEdMX0ZBTFNFOworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgR0xfUE9JTlRTOgorICAgICAgICBzbW9vdGggPSBjLT5wb2ludC5zbW9vdGg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfTElORVM6CisgICAgY2FzZSBHTF9MSU5FX0xPT1A6CisgICAgY2FzZSBHTF9MSU5FX1NUUklQOgorICAgICAgICBzbW9vdGggPSBjLT5saW5lLnNtb290aDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgoKGVuYWJsZXMgJiBHR0xfRU5BQkxFX0FBKT8xOjApICE9IHNtb290aCkKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5lbmFibGVEaXNhYmxlKGMsIEdHTF9BQSwgc21vb3RoKTsKKworICAgIC8vIHNldCB0aGUgc2hhZGUgbW9kZWwgZm9yIHRoaXMgcHJpbWl0aXZlCisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5zaGFkZU1vZGVsKGMsCisgICAgICAgICAgICAobW9kZSA9PSBHTF9QT0lOVFMpID8gR0xfRkxBVCA6IGMtPmxpZ2h0aW5nLnNoYWRlTW9kZWwpOworCisgICAgLy8gY29tcHV0ZSBhbGwgdGhlIG1hdHJpY2VzIHdlJ2xsIG5lZWQuLi4KKyAgICB1aW50MzJfdCB3YW50ID0KKyAgICAgICAgICAgIHRyYW5zZm9ybV9zdGF0ZV90OjpNVlAgfAorICAgICAgICAgICAgdHJhbnNmb3JtX3N0YXRlX3Q6OlZJRVdQT1JUOworICAgIGlmIChjLT5saWdodGluZy5lbmFibGUpIHsgLy8gbmVlZHMgbm9ybWFsIHRyYW5zZm9ybXMgYW5kIGV5ZSBjb29yZHMKKyAgICAgICAgd2FudCB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZVSTsKKyAgICAgICAgd2FudCB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6TU9ERUxWSUVXOworICAgIH0KKyAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykgeyAvLyBuZWVkcyB0ZXh0dXJlIHRyYW5zZm9ybXMKKyAgICAgICAgd2FudCB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6VEVYVFVSRTsKKyAgICB9CisgICAgaWYgKGMtPmNsaXBQbGFuZXMuZW5hYmxlIHx8IChlbmFibGVzICYgR0dMX0VOQUJMRV9GT0cpKSB7IAorICAgICAgICB3YW50IHw9IHRyYW5zZm9ybV9zdGF0ZV90OjpNT0RFTFZJRVc7IC8vIG5lZWRzIGV5ZSBjb29yZHMKKyAgICB9CisgICAgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtKGMsIHdhbnQpOworCisgICAgLy8gdGV4dHVyZXMuLi4KKyAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykKKyAgICAgICAgb2dsZXNfdmFsaWRhdGVfdGV4dHVyZShjKTsKKworICAgIC8vIHZlcnRleCBjb21waWxlcnMKKyAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnQgPSBjb21waWxlRWxlbWVudF9fZ2VuZXJpYzsKKyAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnRzID0gY29tcGlsZUVsZW1lbnRzX19nZW5lcmljOworCisgICAgLy8gdmVydGV4IHRyYW5zZm9ybQorICAgIGMtPmFycmF5cy5tdnBfdHJhbnNmb3JtID0KKyAgICAgICAgYy0+dHJhbnNmb3Jtcy5tdnAucG9pbnR2W2MtPmFycmF5cy52ZXJ0ZXguc2l6ZSAtIDJdOworCisgICAgYy0+YXJyYXlzLm12X3RyYW5zZm9ybSA9CisgICAgICAgIGMtPnRyYW5zZm9ybXMubW9kZWx2aWV3LnRyYW5zZm9ybS5wb2ludHZbYy0+YXJyYXlzLnZlcnRleC5zaXplIC0gMl07CisgICAgCisgICAgLyoKKyAgICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqICBwaWNrIGZldGNoZXJzCisgICAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKyAgICAKKyAgICBhcnJheV9tYWNoaW5lX3QmIGFtID0gYy0+YXJyYXlzOworICAgIGFtLnZlcnRleC5mZXRjaCA9IGZldGNoTm9wOworICAgIGFtLm5vcm1hbC5mZXRjaCA9IGN1cnJlbnROb3JtYWw7CisgICAgYW0uY29sb3IuZmV0Y2ggPSBjdXJyZW50Q29sb3I7CisgICAgCisgICAgaWYgKGFtLnZlcnRleC5lbmFibGUpIHsKKyAgICAgICAgYW0udmVydGV4LnJlc29sdmUoKTsKKyAgICAgICAgaWYgKGFtLnZlcnRleC5ibyB8fCBhbS52ZXJ0ZXgucG9pbnRlcikgeworICAgICAgICAgICAgYW0udmVydGV4LmZldGNoID0gdmVydGV4X2ZjdFthbS52ZXJ0ZXguc2l6ZS0yXVthbS52ZXJ0ZXgudHlwZSAmIDB4Rl07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYW0ubm9ybWFsLmVuYWJsZSkgeworICAgICAgICBhbS5ub3JtYWwucmVzb2x2ZSgpOworICAgICAgICBpZiAoYW0ubm9ybWFsLmJvIHx8IGFtLm5vcm1hbC5wb2ludGVyKSB7CisgICAgICAgICAgICBhbS5ub3JtYWwuZmV0Y2ggPSBub3JtYWxfZmN0W2FtLm5vcm1hbC5zaXplLTNdW2FtLm5vcm1hbC50eXBlICYgMHhGXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhbS5jb2xvci5lbmFibGUpIHsKKyAgICAgICAgYW0uY29sb3IucmVzb2x2ZSgpOworICAgICAgICBpZiAoYy0+bGlnaHRpbmcuZW5hYmxlKSB7CisgICAgICAgICAgICBpZiAoYW0uY29sb3IuYm8gfHwgYW0uY29sb3IucG9pbnRlcikgeworICAgICAgICAgICAgICAgIGFtLmNvbG9yLmZldGNoID0gY29sb3JfZmN0W2FtLmNvbG9yLnNpemUtM11bYW0uY29sb3IudHlwZSAmIDB4Rl07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYW0uY29sb3IuYm8gfHwgYW0uY29sb3IucG9pbnRlcikgeworICAgICAgICAgICAgICAgIGFtLmNvbG9yLmZldGNoID0gY29sb3JfY2xhbXBfZmN0W2FtLmNvbG9yLnNpemUtM11bYW0uY29sb3IudHlwZSAmIDB4Rl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgYWN0aXZlVG11Q291bnQgPSAwOworICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgeworICAgICAgICBhbS50ZXh0dXJlW2ldLmZldGNoID0gY3VycmVudFRleENvb3JkOworICAgICAgICBpZiAoYy0+cmFzdGVyaXplci5zdGF0ZS50ZXh0dXJlW2ldLmVuYWJsZSkgeworCisgICAgICAgICAgICAvLyB0ZXh0dXJlIGZldGNoZXJzLi4uCisgICAgICAgICAgICBpZiAoYW0udGV4dHVyZVtpXS5lbmFibGUpIHsKKyAgICAgICAgICAgICAgICBhbS50ZXh0dXJlW2ldLnJlc29sdmUoKTsKKyAgICAgICAgICAgICAgICBpZiAoYW0udGV4dHVyZVtpXS5ibyB8fCBhbS50ZXh0dXJlW2ldLnBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYW0udGV4dHVyZVtpXS5mZXRjaCA9IHRleHR1cmVfZmN0W2FtLnRleHR1cmVbaV0uc2l6ZS0yXVthbS50ZXh0dXJlW2ldLnR5cGUgJiAweEZdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdGV4dHVyZSB0cmFuc2Zvcm0uLi4KKyAgICAgICAgICAgIGNvbnN0IGludCBpbmRleCA9IGMtPmFycmF5cy50ZXh0dXJlW2ldLnNpemUgLSAyOworICAgICAgICAgICAgYy0+YXJyYXlzLnRleF90cmFuc2Zvcm1baV0gPQorICAgICAgICAgICAgICAgIGMtPnRyYW5zZm9ybXMudGV4dHVyZVtpXS50cmFuc2Zvcm0ucG9pbnR2W2luZGV4XTsKKworICAgICAgICAgICAgYW0udG11ID0gaTsKKyAgICAgICAgICAgIGFjdGl2ZVRtdUNvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBwaWNrIHRoZSB2ZXJ0ZXgtY2xpcHBlcgorICAgIHVpbnQzMl90IGNsaXBwZXIgPSAwOworICAgIC8vIHdlIG11c3QgcmVsb2FkICdlbmFibGVzJyBoZXJlCisgICAgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKKyAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfU01PT1RIKQorICAgICAgICBjbGlwcGVyIHw9IDE7ICAgLy8gd2UgbmVlZCB0byBpbnRlcnBvbGF0ZSBjb2xvcnMKKyAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykKKyAgICAgICAgY2xpcHBlciB8PSAyOyAgIC8vIHdlIG5lZWQgdG8gaW50ZXJwb2xhdGUgdGV4dHVyZXMKKyAgICBzd2l0Y2ggKGNsaXBwZXIpIHsKKyAgICBjYXNlIDA6IGMtPmFycmF5cy5jbGlwVmVydGV4ID0gY2xpcFZlcnRleDsgICAgICBicmVhazsKKyAgICBjYXNlIDE6IGMtPmFycmF5cy5jbGlwVmVydGV4ID0gY2xpcFZlcnRleEM7ICAgICBicmVhazsKKyAgICBjYXNlIDI6IGMtPmFycmF5cy5jbGlwVmVydGV4ID0gY2xpcFZlcnRleFQ7ICAgICBicmVhazsKKyAgICBjYXNlIDM6IGMtPmFycmF5cy5jbGlwVmVydGV4ID0gY2xpcFZlcnRleEFsbDsgICBicmVhazsKKyAgICB9CisgICAgYy0+YXJyYXlzLmNsaXBFeWUgPSBjbGlwRXllOworCisgICAgLy8gcGljayB0aGUgcHJpbWl0aXZlIHJhc3Rlcml6ZXIKKyAgICBvZ2xlc192YWxpZGF0ZV9wcmltaXRpdmVzKGMpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgYXJyYXkgQVBJCisjZW5kaWYKKwordm9pZCBnbFZlcnRleFBvaW50ZXIoCisgICAgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAoc2l6ZTwyIHx8IHNpemU+NCB8fCBzdHJpZGU8MCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEdMX0JZVEU6CisgICAgY2FzZSBHTF9TSE9SVDoKKyAgICBjYXNlIEdMX0ZJWEVEOgorICAgIGNhc2UgR0xfRkxPQVQ6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+YXJyYXlzLnZlcnRleC5pbml0KHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlciwgYy0+YXJyYXlzLmFycmF5X2J1ZmZlciwgMCk7Cit9CisKK3ZvaWQgZ2xDb2xvclBvaW50ZXIoCisgICAgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICAvLyBpbiB0aGVvcnkgb2dsZXMgZG9lc24ndCBhbGxvdyBjb2xvciBhcnJheXMgb2Ygc2l6ZSAzCisgICAgLy8gYnV0IGl0IGlzIHZlcnkgdXNlZnVsIHRvICd2aXN1YWxpemUnIHRoZSBub3JtYWwgYXJyYXkuCisgICAgaWYgKHNpemU8MyB8fCBzaXplPjQgfHwgc3RyaWRlPDApIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgorICAgIGNhc2UgR0xfRklYRUQ6CisgICAgY2FzZSBHTF9GTE9BVDoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjLT5hcnJheXMuY29sb3IuaW5pdChzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIsIGMtPmFycmF5cy5hcnJheV9idWZmZXIsIDApOworfQorCit2b2lkIGdsTm9ybWFsUG9pbnRlcigKKyAgICBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmIChzdHJpZGU8MCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEdMX0JZVEU6CisgICAgY2FzZSBHTF9TSE9SVDoKKyAgICBjYXNlIEdMX0ZJWEVEOgorICAgIGNhc2UgR0xfRkxPQVQ6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+YXJyYXlzLm5vcm1hbC5pbml0KDMsIHR5cGUsIHN0cmlkZSwgcG9pbnRlciwgYy0+YXJyYXlzLmFycmF5X2J1ZmZlciwgMCk7Cit9CisKK3ZvaWQgZ2xUZXhDb29yZFBvaW50ZXIoCisgICAgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAoc2l6ZTwyIHx8IHNpemU+NCB8fCBzdHJpZGU8MCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEdMX0JZVEU6CisgICAgY2FzZSBHTF9TSE9SVDoKKyAgICBjYXNlIEdMX0ZJWEVEOgorICAgIGNhc2UgR0xfRkxPQVQ6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgaW50IHRtdSA9IGMtPmFycmF5cy5hY3RpdmVUZXh0dXJlOworICAgIGMtPmFycmF5cy50ZXh0dXJlW3RtdV0uaW5pdChzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIsCisgICAgICAgICAgICBjLT5hcnJheXMuYXJyYXlfYnVmZmVyLCAwKTsKK30KKworCit2b2lkIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xlbnVtIGFycmF5KSB7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBlbmFibGVEaXNhYmxlQ2xpZW50U3RhdGUoYywgYXJyYXksIHRydWUpOworfQorCit2b2lkIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMZW51bSBhcnJheSkgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgZW5hYmxlRGlzYWJsZUNsaWVudFN0YXRlKGMsIGFycmF5LCBmYWxzZSk7Cit9CisKK3ZvaWQgZ2xDbGllbnRBY3RpdmVUZXh0dXJlKEdMZW51bSB0ZXh0dXJlKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKHRleHR1cmU8R0xfVEVYVFVSRTAgfHwgdGV4dHVyZT49R0xfVEVYVFVSRTArR0dMX1RFWFRVUkVfVU5JVF9DT1VOVCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPmFycmF5cy5hY3RpdmVUZXh0dXJlID0gdGV4dHVyZSAtIEdMX1RFWFRVUkUwOworfQorCit2b2lkIGdsRHJhd0FycmF5cyhHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAoY291bnQ8MCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIEdMX1BPSU5UUzoKKyAgICBjYXNlIEdMX0xJTkVfU1RSSVA6CisgICAgY2FzZSBHTF9MSU5FX0xPT1A6CisgICAgY2FzZSBHTF9MSU5FUzoKKyAgICBjYXNlIEdMX1RSSUFOR0xFX1NUUklQOgorICAgIGNhc2UgR0xfVFJJQU5HTEVfRkFOOgorICAgIGNhc2UgR0xfVFJJQU5HTEVTOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNvdW50ID09IDAgfHwgIWMtPmFycmF5cy52ZXJ0ZXguZW5hYmxlKQorICAgICAgICByZXR1cm47CisgICAgaWYgKChjLT5jdWxsLmVuYWJsZSkgJiYgKGMtPmN1bGwuY3VsbEZhY2UgPT0gR0xfRlJPTlRfQU5EX0JBQ0spKQorICAgICAgICByZXR1cm47IC8vIGFsbCB0cmlhbmdsZXMgYXJlIGN1bGxlZAorCisgICAgdmFsaWRhdGVfYXJyYXlzKGMsIG1vZGUpOworICAgIGRyYXdBcnJheXNQcmltc1ttb2RlXShjLCBmaXJzdCwgY291bnQpOworCisjaWYgVkNfQ0FDSEVfU1RBVElTVElDUworICAgIGMtPnZjLnRvdGFsID0gY291bnQ7CisgICAgYy0+dmMuZHVtcF9zdGF0cyhtb2RlKTsKKyNlbmRpZgorfQorCit2b2lkIGdsRHJhd0VsZW1lbnRzKAorICAgIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKGNvdW50PDApIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBHTF9QT0lOVFM6CisgICAgY2FzZSBHTF9MSU5FX1NUUklQOgorICAgIGNhc2UgR0xfTElORV9MT09QOgorICAgIGNhc2UgR0xfTElORVM6CisgICAgY2FzZSBHTF9UUklBTkdMRV9TVFJJUDoKKyAgICBjYXNlIEdMX1RSSUFOR0xFX0ZBTjoKKyAgICBjYXNlIEdMX1RSSUFOR0xFUzoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6CisgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVDoKKyAgICAgICAgYy0+YXJyYXlzLmluZGljZXNUeXBlID0gdHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoY291bnQgPT0gMCB8fCAhYy0+YXJyYXlzLnZlcnRleC5lbmFibGUpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoKGMtPmN1bGwuZW5hYmxlKSAmJiAoYy0+Y3VsbC5jdWxsRmFjZSA9PSBHTF9GUk9OVF9BTkRfQkFDSykpCisgICAgICAgIHJldHVybjsgLy8gYWxsIHRyaWFuZ2xlcyBhcmUgY3VsbGVkCisKKyAgICAvLyBjbGVhciB0aGUgdmVydGV4LWNhY2hlCisgICAgYy0+dmMuY2xlYXIoKTsKKyAgICB2YWxpZGF0ZV9hcnJheXMoYywgbW9kZSk7CisgICAgCisgICAgLy8gaWYgaW5kaWNlcyBhcmUgaW4gYSBidWZmZXIgb2JqZWN0LCB0aGUgcG9pbnRlciBpcyB0cmVhdGVkIGFzIGFuCisgICAgLy8gb2Zmc2V0IGluIHRoYXQgYnVmZmVyLgorICAgIGlmIChjLT5hcnJheXMuZWxlbWVudF9hcnJheV9idWZmZXIpIHsKKyAgICAgICAgaW5kaWNlcyA9IGMtPmFycmF5cy5lbGVtZW50X2FycmF5X2J1ZmZlci0+ZGF0YSArIHVpbnRwdHJfdChpbmRpY2VzKTsKKyAgICB9CisKKyAgICBkcmF3RWxlbWVudHNQcmltc1ttb2RlXShjLCBjb3VudCwgaW5kaWNlcyk7CisKKyNpZiBWQ19DQUNIRV9TVEFUSVNUSUNTCisgICAgYy0+dmMudG90YWwgPSBjb3VudDsKKyAgICBjLT52Yy5kdW1wX3N0YXRzKG1vZGUpOworI2VuZGlmCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGJ1ZmZlcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBnbEJpbmRCdWZmZXIoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcikKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmICgodGFyZ2V0IT1HTF9BUlJBWV9CVUZGRVIpICYmICh0YXJnZXQhPUdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciBvYmplY3QsIG9yIGJpbmQgYW4gZXhpc3Rpbmcgb25lCisgICAgYnVmZmVyX3QgY29uc3QqIGJvID0gMDsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIGJvID0gYy0+YnVmZmVyT2JqZWN0TWFuYWdlci0+YmluZChidWZmZXIpOworICAgICAgICBpZiAoIWJvKSB7CisgICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9PVVRfT0ZfTUVNT1JZKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICAoKHRhcmdldCA9PSBHTF9BUlJBWV9CVUZGRVIpID8gCisgICAgICAgICAgICBjLT5hcnJheXMuYXJyYXlfYnVmZmVyIDogYy0+YXJyYXlzLmVsZW1lbnRfYXJyYXlfYnVmZmVyKSA9IGJvOworfQorCit2b2lkIGdsQnVmZmVyRGF0YShHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwgR0xlbnVtIHVzYWdlKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKCh0YXJnZXQhPUdMX0FSUkFZX0JVRkZFUikgJiYgKHRhcmdldCE9R0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIpKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHNpemU8MCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoKHVzYWdlIT1HTF9TVEFUSUNfRFJBVykgJiYgKHVzYWdlIT1HTF9EWU5BTUlDX0RSQVcpKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYnVmZmVyX3QgY29uc3QqIGJvID0gKCh0YXJnZXQgPT0gR0xfQVJSQVlfQlVGRkVSKSA/IAorICAgICAgICAgICAgYy0+YXJyYXlzLmFycmF5X2J1ZmZlciA6IGMtPmFycmF5cy5lbGVtZW50X2FycmF5X2J1ZmZlcik7CisKKyAgICBpZiAoYm8gPT0gMCkgeworICAgICAgICAvLyBjYW4ndCBtb2RpZnkgYnVmZmVyIDAKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYnVmZmVyX3QqIGVkaXRfYm8gPSBjb25zdF9jYXN0PGJ1ZmZlcl90Kj4oYm8pOworICAgIGlmIChjLT5idWZmZXJPYmplY3RNYW5hZ2VyLT5hbGxvY2F0ZVN0b3JlKGVkaXRfYm8sIHNpemUsIHVzYWdlKSAhPSAwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX09VVF9PRl9NRU1PUlkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChkYXRhKSB7CisgICAgICAgIG1lbWNweShiby0+ZGF0YSwgZGF0YSwgc2l6ZSk7CisgICAgfQorfQorCit2b2lkIGdsQnVmZmVyU3ViRGF0YShHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKCh0YXJnZXQhPUdMX0FSUkFZX0JVRkZFUikgJiYgKHRhcmdldCE9R0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIpKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG9mZnNldDwwIHx8IHNpemU8MCB8fCBkYXRhPT0wKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJ1ZmZlcl90IGNvbnN0KiBibyA9ICgodGFyZ2V0ID09IEdMX0FSUkFZX0JVRkZFUikgPyAKKyAgICAgICAgICAgIGMtPmFycmF5cy5hcnJheV9idWZmZXIgOiBjLT5hcnJheXMuZWxlbWVudF9hcnJheV9idWZmZXIpOworCisgICAgaWYgKGJvID09IDApIHsKKyAgICAgICAgLy8gY2FuJ3QgbW9kaWZ5IGJ1ZmZlciAwCisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAob2Zmc2V0K3NpemUgPiBiby0+c2l6ZSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZW1jcHkoYm8tPmRhdGEgKyBvZmZzZXQsIGRhdGEsIHNpemUpOworfQorCit2b2lkIGdsRGVsZXRlQnVmZmVycyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogYnVmZmVycykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmIChuPDApIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGludCBpPTAgOyBpPG4gOyBpKyspIHsKKyAgICAgICAgR0x1aW50IG5hbWUgPSBidWZmZXJzW2ldOworICAgICAgICBpZiAobmFtZSkgeworICAgICAgICAgICAgLy8gdW5iaW5kIGJvdW5kIGRlbGV0ZWQgYnVmZmVycy4uLgorICAgICAgICAgICAgaWYgKGMtPmFycmF5cy5lbGVtZW50X2FycmF5X2J1ZmZlci0+bmFtZSA9PSBuYW1lKSB7CisgICAgICAgICAgICAgICAgYy0+YXJyYXlzLmVsZW1lbnRfYXJyYXlfYnVmZmVyID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjLT5hcnJheXMuYXJyYXlfYnVmZmVyLT5uYW1lID09IG5hbWUpIHsKKyAgICAgICAgICAgICAgICBjLT5hcnJheXMuYXJyYXlfYnVmZmVyID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjLT5hcnJheXMudmVydGV4LmJvLT5uYW1lID09IG5hbWUpIHsKKyAgICAgICAgICAgICAgICBjLT5hcnJheXMudmVydGV4LmJvID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjLT5hcnJheXMubm9ybWFsLmJvLT5uYW1lID09IG5hbWUpIHsKKyAgICAgICAgICAgICAgICBjLT5hcnJheXMubm9ybWFsLmJvID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjLT5hcnJheXMuY29sb3IuYm8tPm5hbWUgPT0gbmFtZSkgeworICAgICAgICAgICAgICAgIGMtPmFycmF5cy5jb2xvci5ibyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCB0PTAgOyB0PEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyB0KyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYy0+YXJyYXlzLnRleHR1cmVbdF0uYm8tPm5hbWUgPT0gbmFtZSkgeworICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMudGV4dHVyZVt0XS5ibyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAgICAKKyAgICBjLT5idWZmZXJPYmplY3RNYW5hZ2VyLT5kZWxldGVCdWZmZXJzKG4sIGJ1ZmZlcnMpOworICAgIGMtPmJ1ZmZlck9iamVjdE1hbmFnZXItPnJlY3ljbGVUb2tlbnMobiwgYnVmZmVycyk7Cit9CisKK3ZvaWQgZ2xHZW5CdWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50KiBidWZmZXJzKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKG48MCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjLT5idWZmZXJPYmplY3RNYW5hZ2VyLT5nZXRUb2tlbihuLCBidWZmZXJzKTsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvYXJyYXkuaCBiL29wZW5nbC9saWJhZ2wvYXJyYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTU2OTc4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9hcnJheS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIGxpYnMvb3BlbmdsZXMvYXJyYXkuaAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgQU5EUk9JRF9PUEVOR0xFU19BUlJBWV9ICisjZGVmaW5lIEFORFJPSURfT1BFTkdMRVNfQVJSQVlfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGdsIHsKK3N0cnVjdCBvZ2xlc19jb250ZXh0X3Q7Cit9OworCit2b2lkIG9nbGVzX2luaXRfYXJyYXkob2dsZXNfY29udGV4dF90KiBjKTsKK3ZvaWQgb2dsZXNfdW5pbml0X2FycmF5KG9nbGVzX2NvbnRleHRfdCogYyk7CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX0FSUkFZX0gKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9jb250ZXh0LmggYi9vcGVuZ2wvbGliYWdsL2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjM2YjU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9jb250ZXh0LmgKQEAgLTAsMCArMSwyMCBAQAorLyogbGlicy9vcGVuZ2xlcy9jb250ZXh0LmgKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8cHJpdmF0ZS9vcGVuZ2xlcy9nbF9jb250ZXh0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpnbDsKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvZHh0LmNwcCBiL29wZW5nbC9saWJhZ2wvZHh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzhjODFmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9keHQuY3BwCkBAIC0wLDAgKzEsNjM2IEBACisvKiBsaWJzL29wZW5nbGVzL2R4dC5jcHAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIFRJTUlORyAwCisKKyNpZiBUSU1JTkcKKyNpbmNsdWRlIDxzeXMvdGltZS5oPiAvLyBmb3Igb3B0aW1pemF0aW9uIHRpbWluZworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDx1dGlscy9FbmRpYW4uaD4KKworI2luY2x1ZGUgImNvbnRleHQuaCIKKworI2RlZmluZSBUSU1JTkcgMAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyB1aW50OF90IGF2ZzIzdGFiWzY0KjY0XTsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgdGFibGVzX2luaXRpYWxpemVkID0gMDsKKworLy8gRGVmaW5pdGlvbnMgYmVsb3cgYXJlIGVxdWl2YWxlbnQgdG8gdGhlc2Ugb3ZlciB0aGUgdmFsaWQgcmFuZ2Ugb2YgYXJndW1lbnRzCisvLyAgI2RlZmluZSBkaXY1KHgpICgoeCkvNSkKKy8vICAjZGVmaW5lIGRpdjcoeCkgKCh4KS83KQorCisvLyBVc2UgZml4ZWQtcG9pbnQgdG8gZGl2aWRlIGJ5IDUgYW5kIDcKKy8vIDMyNzcgPSAyXjE0LzUgKyAxCisvLyAyMzQxID0gMl4xNC83ICsgMQorI2RlZmluZSBkaXY1KHgpICgoKHgpKjMyNzcpID4+IDE0KQorI2RlZmluZSBkaXY3KHgpICgoKHgpKjIzNDEpID4+IDE0KQorCisvLyBUYWJsZSB3aXRoIGVudHJ5IFthIDw8IDYgfCBiXSA9ICgyKmEgKyBiKS8zIGZvciAwIDw9IGEsYiA8IDY0CisjZGVmaW5lIGF2ZzIzKHgwLHgxKSBhdmcyM3RhYlsoKHgwKSA8PCA2KSB8ICh4MSldCisKKy8vIEV4dHJhY3QgNS82LzUgUkdCCisjZGVmaW5lIHJlZCh4KSAgICgoKHgpID4+IDExKSAmIDB4MWYpCisjZGVmaW5lIGdyZWVuKHgpICgoKHgpID4+ICA1KSAmIDB4M2YpCisjZGVmaW5lIGJsdWUoeCkgICggKHgpICAgICAgICAmIDB4MWYpCisKKy8qCisgKiBDb252ZXJ0IDUvNi81IFJHQiAoYXMgMyBpbnRzKSB0byA4LzgvOAorICoKKyAqIE9wZXJhdGlvbiBjb3VudDogOCA8PCwgMCAmLCA1IHwKKyAqLworaW5saW5lIHN0YXRpYyBpbnQgcmdiNTY1U2VwVG84ODgoaW50IHIsIGludCBnLCBpbnQgYikKKworeworICAgIHJldHVybiAoKCgociA8PCAzKSB8IChyID4+IDIpKSA8PCAxNikgfAorICAgICAgICAgICAgKCgoZyA8PCAyKSB8IChnID4+IDQpKSA8PCAgOCkgfAorICAgICAgICAgICAgICgoYiA8PCAzKSB8IChiID4+IDIpKSk7Cit9CisKKy8qCisgKiBDb252ZXJ0IDUvNi81IFJHQiAoYXMgYSBzaW5nbGUgMTYtYml0IHdvcmQpIHRvIDgvOC84CisgKgorICogICAgICAgICAgICAgICAgICAgcjRyM3IycjEgcjBnNWc0ZzMgZzJnMWcwYjQgYjNiMmIxYjAgICByZ2IKKyAqICAgICAgICAgICAgcjRyM3IyIHIxcjBnNWc0IGczZzJnMWcwIGI0YjNiMmIxIGIwIDAgMCAwICAgcmdiIDw8IDMKKyAqIHI0cjNyMnIxIHIwcjRyM3IyIGc1ZzRnM2cyIGcxZzBnNWc0IGI0YjNiMmIxIGIwYjRiM2IyICAgZGVzaXJlZCByZXN1bHQKKyAqCisgKiBDb25zdHJ1Y3QgdGhlIDI0LWJpdCBSR0Igd29yZCBhczoKKyAqCisgKiByNHIzcjJyMSByMC0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLSAgKHJnYiA8PCA4KSAmIDB4ZjgwMDAwCisgKiAgICAgICAgICAgIHI0cjNyMiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLSAgKHJnYiA8PCAzKSAmIDB4MDcwMDAwCisgKiAgICAgICAgICAgICAgICAgICBnNWc0ZzNnMiBnMWcwLS0tLSAtLS0tLS0tLSAtLS0tLS0tLSAgKHJnYiA8PCA1KSAmIDB4MDBmYzAwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZzVnNCAtLS0tLS0tLSAtLS0tLS0tLSAgKHJnYiA+PiAxKSAmIDB4MDAwMzAwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiNGIzYjJiMSBiMC0tLS0tLSAgKHJnYiA8PCAzKSAmIDB4MDAwMGY4CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI0YjNiMiAgKHJnYiA+PiAyKSAmIDB4MDAwMDA3CisgKgorICogT3BlcmF0aW9uIGNvdW50OiA1IDw8LCA2ICYsIDUgfCAobi5iLiByZ2IgPj4gMyBpcyB1c2VkIHR3aWNlKQorICovCitpbmxpbmUgc3RhdGljIGludCByZ2I1NjVUbzg4OChpbnQgcmdiKQorCit7CisgICAgaW50IHJnYjMgPSByZ2IgPj4gMzsKKyAgICByZXR1cm4gKCgocmdiIDw8IDgpICYgMHhmODAwMDApIHwKKyAgICAgICAgICAgICggcmdiMyAgICAgICYgMHgwNzAwMDApIHwKKyAgICAgICAgICAgICgocmdiIDw8IDUpICYgMHgwMGZjMDApIHwKKyAgICAgICAgICAgICgocmdiID4+IDEpICYgMHgwMDAzMDApIHwKKyAgICAgICAgICAgICggcmdiMyAgICAgICYgMHgwMDAwZjgpIHwKKyAgICAgICAgICAgICgocmdiID4+IDIpICYgMHgwMDAwMDcpKTsKK30KKworI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KK3N0YXRpYyB1aW50MzJfdCBzd2FwKHVpbnQzMl90IHgpIHsKKyAgICBpbnQgYjAgPSAoeCA+PiAyNCkgJiAweGZmOworICAgIGludCBiMSA9ICh4ID4+IDE2KSAmIDB4ZmY7CisgICAgaW50IGIyID0gKHggPj4gIDgpICYgMHhmZjsKKyAgICBpbnQgYjMgPSAoeCAgICAgICkgJiAweGZmOworICAgIAorICAgIHJldHVybiAodWludDMyX3QpKChiMyA8PCAyNCkgfCAoYjIgPDwgMTYpIHwgKGIxIDw8IDgpIHwgYjApOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitpbml0X3RhYmxlcygpCit7CisgICAgaWYgKHRhYmxlc19pbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNjQ7IGorKykgeworICAgICAgICAgICAgaW50IGF2ZyA9ICgyKmkgKyBqKS8zOworICAgICAgICAgICAgYXZnMjN0YWJbKGkgPDwgNikgfCBqXSA9IGF2ZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFzbSB2b2xhdGlsZSAoIiIgOiA6IDogIm1lbW9yeSIpOworICAgIHRhYmxlc19pbml0aWFsaXplZCA9IDE7Cit9CisKKy8qCisgKiBVdGlsaXR5IHRvIHNjYW4gYSBEWFQxIGNvbXByZXNzZWQgdGV4dHVyZSB0byBkZXRlcm1pbmUgd2hldGhlciBpdAorICogY29udGFpbnMgYSB0cmFuc3BhcmVudCBwaXhlbCAoY29sb3IwIDwgY29sb3IxLCBjb2RlID09IDMpLiAgVGhpcworICogbWF5IGJlIHVzZWZ1bCBpZiB0aGUgYXBwbGljYXRpb24gbGFja3MgaW5mb3JtYXRpb24gYXMgdG8gd2hldGhlcgorICogdGhlIHRydWUgZm9ybWF0IGlzIEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQgb3IKKyAqIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhULgorICovCitib29sCitEWFQxSGFzQWxwaGEoY29uc3QgR0x2b2lkICpkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsgICAgCisjaWYgVElNSU5HCisgICAgc3RydWN0IHRpbWV2YWwgc3RhcnRfdCwgZW5kX3Q7CisgICAgc3RydWN0IHRpbWV6b25lIHR6OworICAgIAorICAgIGdldHRpbWVvZmRheSgmc3RhcnRfdCwgJnR6KTsKKyNlbmRpZgorCisgICAgYm9vbCBoYXNBbHBoYSA9IGZhbHNlOworCisgICAgaW50IHhibG9ja3MgPSAod2lkdGggKyAzKS80OworICAgIGludCB5YmxvY2tzID0gKGhlaWdodCArIDMpLzQ7CisgICAgaW50IG51bWJsb2NrcyA9IHhibG9ja3MqeWJsb2NrczsKKworICAgIHVpbnQzMl90IGNvbnN0ICpkMzIgPSAodWludDMyX3QgKilkYXRhOworICAgIGZvciAoaW50IGIgPSAwOyBiIDwgbnVtYmxvY2tzOyBiKyspIHsKKyAgICAgICAgdWludDMyX3QgY29sb3JzID0gKmQzMisrOworICAgICAgICAKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisgICAgICAgIGNvbG9ycyA9IHN3YXAoY29sb3JzKTsKKyNlbmRpZgorICAgICAgICAKKyAgICAgICAgdWludDE2X3QgY29sb3IwID0gY29sb3JzICYgMHhmZmZmOworICAgICAgICB1aW50MTZfdCBjb2xvcjEgPSBjb2xvcnMgPj4gMTY7CisgICAgICAgIAorICAgICAgICBpZiAoY29sb3IwIDwgY29sb3IxKSB7CisgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIG5lZWQgdG8gZW5kaWFuLXN3YXAgd2l0aGluICdiaXRzJworICAgICAgICAgICAgLy8gc2luY2Ugd2UgZG9uJ3QgY2FyZSB3aGljaCBwaXhlbCBpcyB0aGUgdHJhbnNwYXJlbnQgb25lCisgICAgICAgICAgICB1aW50MzJfdCBiaXRzID0gKmQzMisrOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBEZXRlY3QgaWYgYW55IChvZGQsIGV2ZW4pIHBhaXIgb2YgYml0cyBhcmUgJzExJworICAgICAgICAgICAgLy8gICAgICBiaXRzOiBiMzEgYjMwIGIyOSAuLi4gYjMgYjIgYjEgYjAKKyAgICAgICAgICAgIC8vIGJpdHMgPj4gMTogYjMxIGIzMSBiMzAgLi4uIGI0IGIzIGIyIGIxCisgICAgICAgICAgICAvLyAgICAgICAgICY6IGIzMSAoYjMxICYgYjMwKSAoYjI5ICYgYjI4KSAuLi4gKGIyICYgYjEpIChiMSAmIGIwKQorICAgICAgICAgICAgLy8gICYgMHg1NS4uOiAgIDAgKGIzMSAmIGIzMCkgICAgICAgMCAgICAgLi4uICAgICAwICAgICAoYjEgJiBiMCkKKyAgICAgICAgICAgIGlmICgoKGJpdHMgJiAoYml0cyA+PiAxKSkgJiAweDU1NTU1NTU1KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaGFzQWxwaGEgPSB0cnVlOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNraXAgNCBieXRlcworICAgICAgICAgICAgKytkMzI7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgZG9uZToKKyNpZiBUSU1JTkcKKyAgICBnZXR0aW1lb2ZkYXkoJmVuZF90LCAmdHopOworICAgIGxvbmcgdXNlYyA9IChlbmRfdC50dl9zZWMgLSBzdGFydF90LnR2X3NlYykqMTAwMDAwMCArCisgICAgICAgIChlbmRfdC50dl91c2VjIC0gc3RhcnRfdC50dl91c2VjKTsKKyAgICAKKyAgICBwcmludGYoIlNjYW5uZWQgdz0lZCBoPSVkIGluICVsZCB1c2VjXG4iLCB3aWR0aCwgaGVpZ2h0LCB1c2VjKTsKKyNlbmRpZgorICAgIAorICAgIHJldHVybiBoYXNBbHBoYTsKK30KKworc3RhdGljIHZvaWQKK2RlY29kZURYVDEoY29uc3QgR0x2b2lkICpkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgIHZvaWQgKnN1cmZhY2UsIGludCBzdHJpZGUsCisgICAgICAgICAgIGJvb2wgaGFzQWxwaGEpCisgICAgCit7CisgICAgaW5pdF90YWJsZXMoKTsKKyAgICAKKyAgICB1aW50MzJfdCBjb25zdCAqZDMyID0gKHVpbnQzMl90ICopZGF0YTsKKyAgICAKKyAgICAvLyBDb2xvciB0YWJsZSBmb3IgdGhlIGN1cnJlbnQgYmxvY2sKKyAgICB1aW50MTZfdCBjWzRdOworICAgIGNbMF0gPSBjWzFdID0gY1syXSA9IGNbM10gPSAwOworICAgIAorICAgIC8vIFNwZWNpZmllZCBjb2xvcnMgZnJvbSB0aGUgcHJldmlvdXMgYmxvY2sKKyAgICB1aW50MTZfdCBwcmV2X2NvbG9yMCA9IDB4MDAwMDsKKyAgICB1aW50MTZfdCBwcmV2X2NvbG9yMSA9IDB4MDAwMDsKKyAgICAKKyAgICB1aW50MTZfdCogcm93UHRyID0gKHVpbnQxNl90KilzdXJmYWNlOworICAgIGZvciAoaW50IGJhc2VfeSA9IDA7IGJhc2VfeSA8IGhlaWdodDsgYmFzZV95ICs9IDQsIHJvd1B0ciArPSA0KnN0cmlkZSkgeworICAgICAgICB1aW50MTZfdCAqYmxvY2tQdHIgPSByb3dQdHI7CisgICAgICAgIGZvciAoaW50IGJhc2VfeCA9IDA7IGJhc2VfeCA8IHdpZHRoOyBiYXNlX3ggKz0gNCwgYmxvY2tQdHIgKz0gNCkgeworICAgICAgICAgICAgdWludDMyX3QgY29sb3JzID0gKmQzMisrOworICAgICAgICAgICAgdWludDMyX3QgYml0cyA9ICpkMzIrKzsKKyAgICAgICAgICAgIAorI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyAgICAgICAgICAgIGNvbG9ycyA9IHN3YXAoY29sb3JzKTsKKyAgICAgICAgICAgIGJpdHMgPSBzd2FwKGJpdHMpOworI2VuZGlmCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFJhdyBjb2xvcnMKKyAgICAgICAgICAgIHVpbnQxNl90IGNvbG9yMCA9IGNvbG9ycyAmIDB4ZmZmZjsKKyAgICAgICAgICAgIHVpbnQxNl90IGNvbG9yMSA9IGNvbG9ycyA+PiAxNjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSWYgdGhlIG5ldyBibG9jayBoYXMgdGhlIHNhbWUgYmFzZSBjb2xvcnMgYXMgdGhlCisgICAgICAgICAgICAvLyBwcmV2aW91cyBvbmUsIHdlIGRvbid0IG5lZWQgdG8gcmVjb21wdXRlIHRoZSBjb2xvcgorICAgICAgICAgICAgLy8gdGFibGUgY1tdCisgICAgICAgICAgICBpZiAoY29sb3IwICE9IHByZXZfY29sb3IwIHx8IGNvbG9yMSAhPSBwcmV2X2NvbG9yMSkgeworICAgICAgICAgICAgICAgIC8vIFN0b3JlIHJhdyBjb2xvcnMgZm9yIGNvbXBhcmlzb24gd2l0aCBuZXh0IGJsb2NrCisgICAgICAgICAgICAgICAgcHJldl9jb2xvcjAgPSBjb2xvcjA7CisgICAgICAgICAgICAgICAgcHJldl9jb2xvcjEgPSBjb2xvcjE7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW50IHIwID0gICByZWQoY29sb3IwKTsKKyAgICAgICAgICAgICAgICBpbnQgZzAgPSBncmVlbihjb2xvcjApOworICAgICAgICAgICAgICAgIGludCBiMCA9ICBibHVlKGNvbG9yMCk7CisKKyAgICAgICAgICAgICAgICBpbnQgcjEgPSAgIHJlZChjb2xvcjEpOworICAgICAgICAgICAgICAgIGludCBnMSA9IGdyZWVuKGNvbG9yMSk7CisgICAgICAgICAgICAgICAgaW50IGIxID0gIGJsdWUoY29sb3IxKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGhhc0FscGhhKSB7CisgICAgICAgICAgICAgICAgICAgIGNbMF0gPSAocjAgPDwgMTEpIHwgKChnMCA+PiAxKSA8PCA2KSB8IChiMCA8PCAxKSB8IDB4MTsKKyAgICAgICAgICAgICAgICAgICAgY1sxXSA9IChyMSA8PCAxMSkgfCAoKGcxID4+IDEpIDw8IDYpIHwgKGIxIDw8IDEpIHwgMHgxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNbMF0gPSBjb2xvcjA7CisgICAgICAgICAgICAgICAgICAgIGNbMV0gPSBjb2xvcjE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGludCByMiwgZzIsIGIyLCByMywgZzMsIGIzLCBhMzsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbnQgYmJpdHMgPSBiaXRzID4+IDE7CisgICAgICAgICAgICAgICAgYm9vbCBoYXMyID0gKChiYml0cyAmIH5iaXRzKSAmIDB4NTU1NTU1NTUpICE9IDA7CisgICAgICAgICAgICAgICAgYm9vbCBoYXMzID0gKChiYml0cyAmICBiaXRzKSAmIDB4NTU1NTU1NTUpICE9IDA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGhhczIgfHwgaGFzMykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3IwID4gY29sb3IxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByMiA9IGF2ZzIzKHIwLCByMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnMiA9IGF2ZzIzKGcwLCBnMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBiMiA9IGF2ZzIzKGIwLCBiMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gYXZnMjMocjEsIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGczID0gYXZnMjMoZzEsIGcwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIzID0gYXZnMjMoYjEsIGIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGEzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKHIwICsgcjEpID4+IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBnMiA9IChnMCArIGcxKSA+PiAxOworICAgICAgICAgICAgICAgICAgICAgICAgYjIgPSAoYjAgKyBiMSkgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSBnMyA9IGIzID0gYTMgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXNBbHBoYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY1syXSA9IChyMiA8PCAxMSkgfCAoKGcyID4+IDEpIDw8IDYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYjIgPDwgMSkgfCAweDE7CisgICAgICAgICAgICAgICAgICAgICAgICBjWzNdID0gKHIzIDw8IDExKSB8ICgoZzMgPj4gMSkgPDwgNikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiMyA8PCAxKSB8IGEzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY1syXSA9IChyMiA8PCAxMSkgfCAoZzIgPDwgNSkgfCBiMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNbM10gPSAocjMgPDwgMTEpIHwgKGczIDw8IDUpIHwgYjM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHVpbnQxNl90KiBibG9ja1Jvd1B0ciA9IGJsb2NrUHRyOworICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCA0OyB5KyssIGJsb2NrUm93UHRyICs9IHN0cmlkZSkgeworICAgICAgICAgICAgICAgIC8vIERvbid0IHByb2Nlc3Mgcm93cyBwYXN0IHRoZSBib3RvbQorICAgICAgICAgICAgICAgIGlmIChiYXNlX3kgKyB5ID49IGhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW50IHcgPSBtaW4od2lkdGggLSBiYXNlX3gsIDQpOworICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gYml0cyAmIDB4MzsKKyAgICAgICAgICAgICAgICAgICAgYml0cyA+Pj0gMjsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGJsb2NrUm93UHRyW3hdID0gY1tjb2RlXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisgICAgCisvLyBPdXRwdXQgZGF0YSBhcyBpbnRlcm5hbGZvcm1hdD1HTF9SR0JBLCB0eXBlPUdMX1VOU0lHTkVEX0JZVEUKK3N0YXRpYyB2b2lkCitkZWNvZGVEWFQzKGNvbnN0IEdMdm9pZCAqZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICB2b2lkICpzdXJmYWNlLCBpbnQgc3RyaWRlKQorCit7CisgICAgaW5pdF90YWJsZXMoKTsKKyAgICAKKyAgICB1aW50MzJfdCBjb25zdCAqZDMyID0gKHVpbnQzMl90ICopZGF0YTsKKyAgICAKKyAgICAvLyBTcGVjaWZpZWQgY29sb3JzIGZyb20gdGhlIHByZXZpb3VzIGJsb2NrCisgICAgdWludDE2X3QgcHJldl9jb2xvcjAgPSAweDAwMDA7CisgICAgdWludDE2X3QgcHJldl9jb2xvcjEgPSAweDAwMDA7CisKKyAgICAvLyBDb2xvciB0YWJsZSBmb3IgdGhlIGN1cnJlbnQgYmxvY2sKKyAgICB1aW50MzJfdCBjWzRdOworICAgIGNbMF0gPSBjWzFdID0gY1syXSA9IGNbM10gPSAwOworCisgICAgdWludDMyX3QqIHJvd1B0ciA9ICh1aW50MzJfdCopc3VyZmFjZTsKKyAgICBmb3IgKGludCBiYXNlX3kgPSAwOyBiYXNlX3kgPCBoZWlnaHQ7IGJhc2VfeSArPSA0LCByb3dQdHIgKz0gNCpzdHJpZGUpIHsKKyAgICAgICAgdWludDMyX3QgKmJsb2NrUHRyID0gcm93UHRyOworICAgICAgICBmb3IgKGludCBiYXNlX3ggPSAwOyBiYXNlX3ggPCB3aWR0aDsgYmFzZV94ICs9IDQsIGJsb2NrUHRyICs9IDQpIHsKKyAgICAgICAgICAgIAorI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyAgICAgICAgICAgIHVpbnQzMl90IGFscGhhaGkgPSAqZDMyKys7CisgICAgICAgICAgICB1aW50MzJfdCBhbHBoYWxvID0gKmQzMisrOworICAgICAgICAgICAgYWxwaGFoaSA9IHN3YXAoYWxwaGFoaSk7CisgICAgICAgICAgICBhbHBoYWxvID0gc3dhcChhbHBoYWxvKTsKKyNlbHNlCisgICAgICAgICAgICB1aW50MzJfdCBhbHBoYWxvID0gKmQzMisrOworICAgICAgICAgICAgdWludDMyX3QgYWxwaGFoaSA9ICpkMzIrKzsKKyNlbmRpZgorCisgICAgICAgICAgICB1aW50MzJfdCBjb2xvcnMgPSAqZDMyKys7CisgICAgICAgICAgICB1aW50MzJfdCBiaXRzID0gKmQzMisrOworICAgICAgICAgICAgCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorICAgICAgICAgICAgY29sb3JzID0gc3dhcChjb2xvcnMpOworICAgICAgICAgICAgYml0cyA9IHN3YXAoYml0cyk7CisjZW5kaWYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdWludDY0X3QgYWxwaGEgPSAoKHVpbnQ2NF90KWFscGhhaGkgPDwgMzIpIHwgYWxwaGFsbzsKKworICAgICAgICAgICAgLy8gUmF3IGNvbG9ycworICAgICAgICAgICAgdWludDE2X3QgY29sb3IwID0gY29sb3JzICYgMHhmZmZmOworICAgICAgICAgICAgdWludDE2X3QgY29sb3IxID0gY29sb3JzID4+IDE2OworCisgICAgICAgICAgICAvLyBJZiB0aGUgbmV3IGJsb2NrIGhhcyB0aGUgc2FtZSBiYXNlIGNvbG9ycyBhcyB0aGUKKyAgICAgICAgICAgIC8vIHByZXZpb3VzIG9uZSwgd2UgZG9uJ3QgbmVlZCB0byByZWNvbXB1dGUgdGhlIGNvbG9yCisgICAgICAgICAgICAvLyB0YWJsZSBjW10KKyAgICAgICAgICAgIGlmIChjb2xvcjAgIT0gcHJldl9jb2xvcjAgfHwgY29sb3IxICE9IHByZXZfY29sb3IxKSB7CisgICAgICAgICAgICAgICAgLy8gU3RvcmUgcmF3IGNvbG9ycyBmb3IgY29tcGFyaXNvbiB3aXRoIG5leHQgYmxvY2sKKyAgICAgICAgICAgICAgICBwcmV2X2NvbG9yMCA9IGNvbG9yMDsKKyAgICAgICAgICAgICAgICBwcmV2X2NvbG9yMSA9IGNvbG9yMTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbnQgYmJpdHMgPSBiaXRzID4+IDE7CisgICAgICAgICAgICAgICAgYm9vbCBoYXMyID0gKChiYml0cyAmIH5iaXRzKSAmIDB4NTU1NTU1NTUpICE9IDA7CisgICAgICAgICAgICAgICAgYm9vbCBoYXMzID0gKChiYml0cyAmICBiaXRzKSAmIDB4NTU1NTU1NTUpICE9IDA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGhhczIgfHwgaGFzMykgeworICAgICAgICAgICAgICAgICAgICBpbnQgcjAgPSAgIHJlZChjb2xvcjApOworICAgICAgICAgICAgICAgICAgICBpbnQgZzAgPSBncmVlbihjb2xvcjApOworICAgICAgICAgICAgICAgICAgICBpbnQgYjAgPSAgYmx1ZShjb2xvcjApOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaW50IHIxID0gICByZWQoY29sb3IxKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGcxID0gZ3JlZW4oY29sb3IxKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGIxID0gIGJsdWUoY29sb3IxKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGludCByMiA9IGF2ZzIzKHIwLCByMSk7CisgICAgICAgICAgICAgICAgICAgIGludCBnMiA9IGF2ZzIzKGcwLCBnMSk7CisgICAgICAgICAgICAgICAgICAgIGludCBiMiA9IGF2ZzIzKGIwLCBiMSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpbnQgcjMgPSBhdmcyMyhyMSwgcjApOworICAgICAgICAgICAgICAgICAgICBpbnQgZzMgPSBhdmcyMyhnMSwgZzApOworICAgICAgICAgICAgICAgICAgICBpbnQgYjMgPSBhdmcyMyhiMSwgYjApOworCisgICAgICAgICAgICAgICAgICAgIGNbMF0gPSByZ2I1NjVTZXBUbzg4OChyMCwgZzAsIGIwKTsKKyAgICAgICAgICAgICAgICAgICAgY1sxXSA9IHJnYjU2NVNlcFRvODg4KHIxLCBnMSwgYjEpOworICAgICAgICAgICAgICAgICAgICBjWzJdID0gcmdiNTY1U2VwVG84ODgocjIsIGcyLCBiMik7CisgICAgICAgICAgICAgICAgICAgIGNbM10gPSByZ2I1NjVTZXBUbzg4OChyMywgZzMsIGIzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIDggYml0cworICAgICAgICAgICAgICAgICAgICBjWzBdID0gcmdiNTY1VG84ODgoY29sb3IwKTsKKyAgICAgICAgICAgICAgICAgICAgY1sxXSA9IHJnYjU2NVRvODg4KGNvbG9yMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCogYmxvY2tSb3dQdHIgPSBibG9ja1B0cjsKKyAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgNDsgeSsrLCBibG9ja1Jvd1B0ciArPSBzdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBEb24ndCBwcm9jZXNzIHJvd3MgcGFzdCB0aGUgYm90b20KKyAgICAgICAgICAgICAgICBpZiAoYmFzZV95ICsgeSA+PSBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGludCB3ID0gbWluKHdpZHRoIC0gYmFzZV94LCA0KTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IGFscGhhICYgMHhmOworICAgICAgICAgICAgICAgICAgICBhbHBoYSA+Pj0gNDsKKworICAgICAgICAgICAgICAgICAgICBpbnQgY29kZSA9IGJpdHMgJiAweDM7CisgICAgICAgICAgICAgICAgICAgIGJpdHMgPj49IDI7CisKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tSb3dQdHJbeF0gPSBjW2NvZGVdIHwgKGEgPDwgMjgpIHwgKGEgPDwgMjQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLy8gT3V0cHV0IGRhdGEgYXMgaW50ZXJuYWxmb3JtYXQ9R0xfUkdCQSwgdHlwZT1HTF9VTlNJR05FRF9CWVRFCitzdGF0aWMgdm9pZAorZGVjb2RlRFhUNShjb25zdCBHTHZvaWQgKmRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgdm9pZCAqc3VyZmFjZSwgaW50IHN0cmlkZSkKKworeworICAgIGluaXRfdGFibGVzKCk7CisgICAgCisgICAgdWludDMyX3QgY29uc3QgKmQzMiA9ICh1aW50MzJfdCAqKWRhdGE7CisgICAgCisgICAgLy8gU3BlY2lmaWVkIGFscGhhcyBmcm9tIHRoZSBwcmV2aW91cyBibG9jaworICAgIHVpbnQ4X3QgcHJldl9hbHBoYTAgPSAweDAwOworICAgIHVpbnQ4X3QgcHJldl9hbHBoYTEgPSAweDAwOworCisgICAgLy8gU3BlY2lmaWVkIGNvbG9ycyBmcm9tIHRoZSBwcmV2aW91cyBibG9jaworICAgIHVpbnQxNl90IHByZXZfY29sb3IwID0gMHgwMDAwOworICAgICB1aW50MTZfdCBwcmV2X2NvbG9yMSA9IDB4MDAwMDsKKworICAgIC8vIEFscGhhIHRhYmxlIGZvciB0aGUgY3VycmVudCBibG9jaworICAgIHVpbnQ4X3QgYVs4XTsKKyAgICBhWzBdID0gYVsxXSA9IGFbMl0gPSBhWzNdID0gYVs0XSA9IGFbNV0gPSBhWzZdID0gYVs3XSA9IDA7CisKKyAgICAvLyBDb2xvciB0YWJsZSBmb3IgdGhlIGN1cnJlbnQgYmxvY2sKKyAgICB1aW50MzJfdCBjWzRdOworICAgIGNbMF0gPSBjWzFdID0gY1syXSA9IGNbM10gPSAwOworCisgICAgaW50IGdvb2RfYTUgPSAwOworICAgIGludCBiYWRfYTUgPSAwOworICAgIGludCBnb29kX2E2ID0gMDsKKyAgICBpbnQgYmFkX2E2ID0gMDsKKyAgICBpbnQgZ29vZF9hNyA9IDA7CisgICAgaW50IGJhZF9hNyA9IDA7CisKKyAgICB1aW50MzJfdCogcm93UHRyID0gKHVpbnQzMl90KilzdXJmYWNlOworICAgIGZvciAoaW50IGJhc2VfeSA9IDA7IGJhc2VfeSA8IGhlaWdodDsgYmFzZV95ICs9IDQsIHJvd1B0ciArPSA0KnN0cmlkZSkgeworICAgICAgICB1aW50MzJfdCAqYmxvY2tQdHIgPSByb3dQdHI7CisgICAgICAgIGZvciAoaW50IGJhc2VfeCA9IDA7IGJhc2VfeCA8IHdpZHRoOyBiYXNlX3ggKz0gNCwgYmxvY2tQdHIgKz0gNCkgeworICAgICAgICAgICAgCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorICAgICAgICAgICAgdWludDMyX3QgYWxwaGFoaSA9ICpkMzIrKzsKKyAgICAgICAgICAgIHVpbnQzMl90IGFscGhhbG8gPSAqZDMyKys7CisgICAgICAgICAgICBhbHBoYWhpID0gc3dhcChhbHBoYWhpKTsKKyAgICAgICAgICAgIGFscGhhbG8gPSBzd2FwKGFscGhhbG8pOworI2Vsc2UKKyAgICAgICAgICAgICB1aW50MzJfdCBhbHBoYWxvID0gKmQzMisrOworICAgICAgICAgICAgIHVpbnQzMl90IGFscGhhaGkgPSAqZDMyKys7CisjZW5kaWYKKworICAgICAgICAgICAgdWludDMyX3QgY29sb3JzID0gKmQzMisrOworICAgICAgICAgICAgdWludDMyX3QgYml0cyA9ICpkMzIrKzsKKyAgICAgICAgICAgIAorI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU54CisgICAgICAgICAgICBjb2xvcnMgPSBzd2FwKGNvbG9ycyk7CisgICAgICAgICAgICBiaXRzID0gc3dhcChiaXRzKTsKKyNlbmRpZgorICAgICAgICAgICAgCisgICAgICAgICAgICB1aW50NjRfdCBhbHBoYSA9ICgodWludDY0X3QpYWxwaGFoaSA8PCAzMikgfCBhbHBoYWxvOworICAgICAgICAgICAgdWludDY0X3QgYWxwaGEwID0gYWxwaGEgJiAweGZmOworICAgICAgICAgICAgYWxwaGEgPj49IDg7CisgICAgICAgICAgICB1aW50NjRfdCBhbHBoYTEgPSBhbHBoYSAmIDB4ZmY7CisgICAgICAgICAgICBhbHBoYSA+Pj0gODsKKworICAgICAgICAgICAgaWYgKGFscGhhMCAhPSBwcmV2X2FscGhhMCB8fCBhbHBoYTEgIT0gcHJldl9hbHBoYTEpIHsKKyAgICAgICAgICAgICAgICBwcmV2X2FscGhhMCA9IGFscGhhMDsKKyAgICAgICAgICAgICAgICBwcmV2X2FscGhhMSA9IGFscGhhMTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBhWzBdID0gYWxwaGEwOworICAgICAgICAgICAgICAgIGFbMV0gPSBhbHBoYTE7CisgICAgICAgICAgICAgICAgaW50IGEwMSA9IGFscGhhMCArIGFscGhhMSAtIDE7CisgICAgICAgICAgICAgICAgaWYgKGFscGhhMCA+IGFscGhhMSkgeworICAgICAgICAgICAgICAgICAgICBhWzJdID0gZGl2Nyg2KmFscGhhMCArICAgYWxwaGExKTsKKyAgICAgICAgICAgICAgICAgICAgYVs0XSA9IGRpdjcoNCphbHBoYTAgKyAzKmFscGhhMSk7CisgICAgICAgICAgICAgICAgICAgIGFbNl0gPSBkaXY3KDIqYWxwaGEwICsgNSphbHBoYTEpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBzeW1tZXRyeSB0byBkZXJpdmUgaGFsZiBvZiB0aGUgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgIC8vIEEgZmV3IHZhbHVlcyB3aWxsIGJlIG9mZiBieSAxICh+LjUlKQorICAgICAgICAgICAgICAgICAgICAvLyBBbHRlcm5hdGUgd2hpY2ggdmFsdWVzIGFyZSBjb21wdXRlZCBkaXJlY3RseQorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2hpY2ggYXJlIGRlcml2ZWQgdG8gdHJ5IHRvIHJlZHVjZSBiaWFzCisgICAgICAgICAgICAgICAgICAgIGFbM10gPSBhMDEgLSBhWzZdOworICAgICAgICAgICAgICAgICAgICBhWzVdID0gYTAxIC0gYVs0XTsKKyAgICAgICAgICAgICAgICAgICAgYVs3XSA9IGEwMSAtIGFbMl07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYVsyXSA9IGRpdjUoNCphbHBoYTAgKyAgIGFscGhhMSk7CisgICAgICAgICAgICAgICAgICAgIGFbNF0gPSBkaXY1KDIqYWxwaGEwICsgMyphbHBoYTEpOworICAgICAgICAgICAgICAgICAgICBhWzNdID0gYTAxIC0gYVs0XTsKKyAgICAgICAgICAgICAgICAgICAgYVs1XSA9IGEwMSAtIGFbMl07CisgICAgICAgICAgICAgICAgICAgIGFbNl0gPSAweDAwOworICAgICAgICAgICAgICAgICAgICBhWzddID0gMHhmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJhdyBjb2xvcnMKKyAgICAgICAgICAgIHVpbnQxNl90IGNvbG9yMCA9IGNvbG9ycyAmIDB4ZmZmZjsKKyAgICAgICAgICAgIHVpbnQxNl90IGNvbG9yMSA9IGNvbG9ycyA+PiAxNjsKKworICAgICAgICAgICAgLy8gSWYgdGhlIG5ldyBibG9jayBoYXMgdGhlIHNhbWUgYmFzZSBjb2xvcnMgYXMgdGhlCisgICAgICAgICAgICAvLyBwcmV2aW91cyBvbmUsIHdlIGRvbid0IG5lZWQgdG8gcmVjb21wdXRlIHRoZSBjb2xvcgorICAgICAgICAgICAgLy8gdGFibGUgY1tdCisgICAgICAgICAgICBpZiAoY29sb3IwICE9IHByZXZfY29sb3IwIHx8IGNvbG9yMSAhPSBwcmV2X2NvbG9yMSkgeworICAgICAgICAgICAgICAgIC8vIFN0b3JlIHJhdyBjb2xvcnMgZm9yIGNvbXBhcmlzb24gd2l0aCBuZXh0IGJsb2NrCisgICAgICAgICAgICAgICAgcHJldl9jb2xvcjAgPSBjb2xvcjA7CisgICAgICAgICAgICAgICAgcHJldl9jb2xvcjEgPSBjb2xvcjE7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW50IGJiaXRzID0gYml0cyA+PiAxOworICAgICAgICAgICAgICAgIGJvb2wgaGFzMiA9ICgoYmJpdHMgJiB+Yml0cykgJiAweDU1NTU1NTU1KSAhPSAwOworICAgICAgICAgICAgICAgIGJvb2wgaGFzMyA9ICgoYmJpdHMgJiAgYml0cykgJiAweDU1NTU1NTU1KSAhPSAwOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChoYXMyIHx8IGhhczMpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHIwID0gICByZWQoY29sb3IwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGcwID0gZ3JlZW4oY29sb3IwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGIwID0gIGJsdWUoY29sb3IwKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGludCByMSA9ICAgcmVkKGNvbG9yMSk7CisgICAgICAgICAgICAgICAgICAgIGludCBnMSA9IGdyZWVuKGNvbG9yMSk7CisgICAgICAgICAgICAgICAgICAgIGludCBiMSA9ICBibHVlKGNvbG9yMSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGludCByMiA9IGF2ZzIzKHIwLCByMSk7CisgICAgICAgICAgICAgICAgICAgIGludCBnMiA9IGF2ZzIzKGcwLCBnMSk7CisgICAgICAgICAgICAgICAgICAgIGludCBiMiA9IGF2ZzIzKGIwLCBiMSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpbnQgcjMgPSBhdmcyMyhyMSwgcjApOworICAgICAgICAgICAgICAgICAgICBpbnQgZzMgPSBhdmcyMyhnMSwgZzApOworICAgICAgICAgICAgICAgICAgICBpbnQgYjMgPSBhdmcyMyhiMSwgYjApOworCisgICAgICAgICAgICAgICAgICAgIGNbMF0gPSByZ2I1NjVTZXBUbzg4OChyMCwgZzAsIGIwKTsKKyAgICAgICAgICAgICAgICAgICAgY1sxXSA9IHJnYjU2NVNlcFRvODg4KHIxLCBnMSwgYjEpOworICAgICAgICAgICAgICAgICAgICBjWzJdID0gcmdiNTY1U2VwVG84ODgocjIsIGcyLCBiMik7CisgICAgICAgICAgICAgICAgICAgIGNbM10gPSByZ2I1NjVTZXBUbzg4OChyMywgZzMsIGIzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIDggYml0cworICAgICAgICAgICAgICAgICAgICBjWzBdID0gcmdiNTY1VG84ODgoY29sb3IwKTsKKyAgICAgICAgICAgICAgICAgICAgY1sxXSA9IHJnYjU2NVRvODg4KGNvbG9yMSk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3QqIGJsb2NrUm93UHRyID0gYmxvY2tQdHI7CisgICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IDQ7IHkrKywgYmxvY2tSb3dQdHIgKz0gc3RyaWRlKSB7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcHJvY2VzcyByb3dzIHBhc3QgdGhlIGJvdG9tCisgICAgICAgICAgICAgICAgaWYgKGJhc2VfeSArIHkgPj0gaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbnQgdyA9IG1pbih3aWR0aCAtIGJhc2VfeCwgNCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFjb2RlID0gYWxwaGEgJiAweDc7CisgICAgICAgICAgICAgICAgICAgIGFscGhhID4+PSAzOworCisgICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gYml0cyAmIDB4MzsKKyAgICAgICAgICAgICAgICAgICAgYml0cyA+Pj0gMjsKKworICAgICAgICAgICAgICAgICAgICBibG9ja1Jvd1B0clt4XSA9IGNbY29kZV0gfCAoYVthY29kZV0gPDwgMjQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyAgIAorLyoKKyAqIERlY29kZSBhIERYVC1jb21wcmVzc2VkIHRleHR1cmUgaW50byBtZW1vcnkuICBEWFQgdGV4dHVyZXMgY29uc2lzdCBvZgorICogYSBzZXJpZXMgb2YgNHg0IHBpeGVsIGJsb2NrcyBpbiBsZWZ0LXRvLXJpZ2h0LCB0b3AtZG93biBvcmRlci4KKyAqIFRoZSBudW1iZXIgb2YgYmxvY2tzIGlzIGdpdmVuIGJ5IGNlaWwod2lkdGgvNCkqY2VpbChoZWlnaHQvNCkuCisgKgorICogJ2RhdGEnIHBvaW50cyB0byB0aGUgdGV4dHVyZSBkYXRhLiAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBpbmRpY2F0ZSB0aGUKKyAqIGRpbWVuc2lvbnMgb2YgdGhlIHRleHR1cmUuICBXZSBhc3N1bWUgd2lkdGggYW5kIGhlaWdodCBhcmUgPj0gMCBidXQKKyAqIGRvIG5vdCByZXF1aXJlIHRoZW0gdG8gYmUgcG93ZXJzIG9mIDIgb3IgZGl2aXNpYmxlIGJ5IGFueSBmYWN0b3IuCisgKgorICogVGhlIG91dHB1dCBpcyB3cml0dGVuIHRvICdzdXJmYWNlJyB3aXRoIGVhY2ggc2NhbmxpbmUgc2VwYXJhdGVkIGJ5CisgKiAnc3RyaWRlJyAyLSBvciA0LWJ5dGUgd29yZHMuCisgKgorICogJ2Zvcm1hdCcgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGNvbXByZXNzaW9uIGFuZCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICoKKyAqICAgR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDoKKyAqICAgICAgVGhlIG91dHB1dCBpcyB3cml0dGVuIGFzIDUvNi81IG9wYXF1ZSBSR0IgKDE2IGJpdCB3b3JkcykuCisgKiAgICAgIDggYnl0ZXMgYXJlIHJlYWQgZnJvbSAnZGF0YScgZm9yIGVhY2ggYmxvY2suCisgKgorICogICBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVAorICogICAgICBUaGUgb3V0cHV0IGlzIHdyaXR0ZW4gYXMgNS81LzUvMSBSR0JBICgxNiBiaXQgd29yZHMpCisgKiAgICAgIDggYnl0ZXMgYXJlIHJlYWQgZnJvbSAnZGF0YScgZm9yIGVhY2ggYmxvY2suCisgKgorICogICBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVAorICogICBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVAorICogICAgICBUaGUgb3V0cHV0IGlzIHdyaXR0ZW4gYXMgOC84LzgvOCBBUkdCICgzMiBiaXQgd29yZHMpCisgKiAgICAgIDE2IGJ5dGVzIGFyZSByZWFkIGZyb20gJ2RhdGEnIGZvciBlYWNoIGJsb2NrLgorICovCit2b2lkCitkZWNvZGVEWFQoY29uc3QgR0x2b2lkICpkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgdm9pZCAqc3VyZmFjZSwgaW50IHN0cmlkZSwgaW50IGZvcm1hdCkKK3sKKyNpZiBUSU1JTkcKKyAgICBzdHJ1Y3QgdGltZXZhbCBzdGFydF90LCBlbmRfdDsKKyAgICBzdHJ1Y3QgdGltZXpvbmUgdHo7CisgICAgCisgICAgZ2V0dGltZW9mZGF5KCZzdGFydF90LCAmdHopOworI2VuZGlmCisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDoKKyAgICAgICAgZGVjb2RlRFhUMShkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdXJmYWNlLCBzdHJpZGUsIGZhbHNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ6CisgICAgICAgIGRlY29kZURYVDEoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3VyZmFjZSwgc3RyaWRlLCB0cnVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ6CisgICAgICAgIGRlY29kZURYVDMoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3VyZmFjZSwgc3RyaWRlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIGNhc2UgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ6CisgICAgICAgIGRlY29kZURYVDUoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3VyZmFjZSwgc3RyaWRlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIAorI2lmIFRJTUlORworICAgIGdldHRpbWVvZmRheSgmZW5kX3QsICZ0eik7CisgICAgbG9uZyB1c2VjID0gKGVuZF90LnR2X3NlYyAtIHN0YXJ0X3QudHZfc2VjKSoxMDAwMDAwICsKKyAgICAgICAgKGVuZF90LnR2X3VzZWMgLSBzdGFydF90LnR2X3VzZWMpOworICAgIAorICAgIHByaW50ZigiTG9hZGVkIHc9JWQgaD0lZCBpbiAlbGQgdXNlY1xuIiwgd2lkdGgsIGhlaWdodCwgdXNlYyk7CisjZW5kaWYKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9keHQuaCBiL29wZW5nbC9saWJhZ2wvZHh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1YTM2YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJhZ2wvZHh0LmgKQEAgLTAsMCArMSwzMyBAQAorLyogbGlicy9vcGVuZ2xlcy9keHQuaAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgQU5EUk9JRF9PUEVOR0xFU19URVhUVVJFX0gKKyNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19URVhUVVJFX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyAgYm9vbCBEWFQxSGFzQWxwaGEoY29uc3QgR0x2b2lkICpkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICB2b2lkIGRlY29kZURYVChjb25zdCBHTHZvaWQgKmRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgdm9pZCAqc3VyZmFjZSwgaW50IHN0cmlkZSwgaW50IGZvcm1hdCk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfVEVYVFVSRV9ICmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2VnbC5jcHAgYi9vcGVuZ2wvbGliYWdsL2VnbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5MGJmMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJhZ2wvZWdsLmNwcApAQCAtMCwwICsxLDE1NDMgQEAKKy8qIAorKioKKyoqIENvcHlyaWdodCAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiRUdMIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisKKyNpbmNsdWRlIDxwaXhlbGZsaW5nZXIvZm9ybWF0Lmg+CisjaW5jbHVkZSA8cGl4ZWxmbGluZ2VyL3BpeGVsZmxpbmdlci5oPgorCisjaW5jbHVkZSAiY29udGV4dC5oIgorI2luY2x1ZGUgInN0YXRlLmgiCisjaW5jbHVkZSAidGV4dHVyZS5oIgorI2luY2x1ZGUgIm1hdHJpeC5oIgorCisjdW5kZWYgTkVMRU0KKyNkZWZpbmUgTkVMRU0oeCkgKHNpemVvZih4KS9zaXplb2YoKih4KSkpCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY29uc3QgdW5zaWduZWQgaW50IE5VTV9ESVNQTEFZUyA9IDE7CisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgZ0luaXRNdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CitzdGF0aWMgcHRocmVhZF9tdXRleF90IGdFcnJvcktleU11dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKK3N0YXRpYyBwdGhyZWFkX2tleV90IGdFR0xFcnJvcktleSA9IC0xOworI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKK25hbWVzcGFjZSBnbCB7CitwdGhyZWFkX2tleV90IGdHTEtleSA9IC0xOworfTsgLy8gbmFtZXNwYWNlIGdsCisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyBUIHNldEVycm9yKEdMaW50IGVycm9yLCBUIHJldHVyblZhbHVlKSB7CisgICAgaWYgKGdnbF91bmxpa2VseShnRUdMRXJyb3JLZXkgPT0gLTEpKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0Vycm9yS2V5TXV0ZXgpOworICAgICAgICBpZiAoZ0VHTEVycm9yS2V5ID09IC0xKQorICAgICAgICAgICAgcHRocmVhZF9rZXlfY3JlYXRlKCZnRUdMRXJyb3JLZXksIE5VTEwpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0Vycm9yS2V5TXV0ZXgpOworICAgIH0KKyAgICBwdGhyZWFkX3NldHNwZWNpZmljKGdFR0xFcnJvcktleSwgKHZvaWQqKWVycm9yKTsKKyAgICByZXR1cm4gcmV0dXJuVmFsdWU7Cit9CisKK3N0YXRpYyBHTGludCBnZXRFcnJvcigpIHsKKyAgICBpZiAoZ2dsX3VubGlrZWx5KGdFR0xFcnJvcktleSA9PSAtMSkpCisgICAgICAgIHJldHVybiBFR0xfU1VDQ0VTUzsKKyAgICBHTGludCBlcnJvciA9IChHTGludClwdGhyZWFkX2dldHNwZWNpZmljKGdFR0xFcnJvcktleSk7CisgICAgcHRocmVhZF9zZXRzcGVjaWZpYyhnRUdMRXJyb3JLZXksICh2b2lkKilFR0xfU1VDQ0VTUyk7CisgICAgcmV0dXJuIGVycm9yOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBlZ2xfZGlzcGxheV90Cit7CisgICAgZWdsX2Rpc3BsYXlfdCgpIDogdHlwZSgwKSwgaW5pdGlhbGl6ZWQoMCkgeyB9CisgICAgCisgICAgc3RhdGljIGVnbF9kaXNwbGF5X3QmIGdldF9kaXNwbGF5KEVHTERpc3BsYXkgZHB5KTsKKyAgICAKKyAgICBzdGF0aWMgRUdMQm9vbGVhbiBpc192YWxpZChFR0xEaXNwbGF5IGRweSkgeworICAgICAgICByZXR1cm4gKCh1aW50cHRyX3QoZHB5KS0xVSkgPj0gTlVNX0RJU1BMQVlTKSA/IEVHTF9GQUxTRSA6IEVHTF9UUlVFOworICAgIH0KKworICAgIE5hdGl2ZURpc3BsYXlUeXBlICAgdHlwZTsKKyAgICB2b2xhdGlsZSBpbnQzMl90ICAgIGluaXRpYWxpemVkOworfTsKKworc3RhdGljIGVnbF9kaXNwbGF5X3QgZ0Rpc3BsYXlzW05VTV9ESVNQTEFZU107CisKK2VnbF9kaXNwbGF5X3QmIGVnbF9kaXNwbGF5X3Q6OmdldF9kaXNwbGF5KEVHTERpc3BsYXkgZHB5KSB7CisgICAgcmV0dXJuIGdEaXNwbGF5c1t1aW50cHRyX3QoZHB5KS0xVV07Cit9CisKK3N0cnVjdCBlZ2xfY29udGV4dF90IHsKKyAgICBlbnVtIHsKKyAgICAgICAgSVNfQ1VSUkVOVCAgICAgID0gICAweDAwMDEwMDAwLAorICAgICAgICBORVZFUl9DVVJSRU5UICAgPSAgIDB4MDAwMjAwMDAKKyAgICB9OworICAgIHVpbnQzMl90ICAgICAgICAgICAgZmxhZ3M7CisgICAgRUdMRGlzcGxheSAgICAgICAgICBkcHk7CisgICAgRUdMQ29uZmlnICAgICAgICAgICBjb25maWc7CisgICAgRUdMU3VyZmFjZSAgICAgICAgICByZWFkOworICAgIEVHTFN1cmZhY2UgICAgICAgICAgZHJhdzsKKworICAgIHN0YXRpYyBpbmxpbmUgZWdsX2NvbnRleHRfdCogY29udGV4dChFR0xDb250ZXh0IGN0eCkgeworICAgICAgICBvZ2xlc19jb250ZXh0X3QqIGNvbnN0IGdsID0gc3RhdGljX2Nhc3Q8b2dsZXNfY29udGV4dF90Kj4oY3R4KTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGVnbF9jb250ZXh0X3QqPihnbC0+cmFzdGVyaXplci5iYXNlKTsKKyAgICB9Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBlZ2xfc3VyZmFjZV90Cit7CisgICAgZW51bSB7CisgICAgICAgIFBBR0VfRkxJUCA9IDB4MDAwMDAwMDEsCisgICAgICAgIE1BR0lDICAgICA9IDB4MzE0MTUyNjUKKyAgICB9OworCisgICAgdWludDMyX3QgICAgICAgICAgICBtYWdpYzsKKyAgICBFR0xEaXNwbGF5ICAgICAgICAgIGRweTsKKyAgICBFR0xDb25maWcgICAgICAgICAgIGNvbmZpZzsKKyAgICBFR0xDb250ZXh0ICAgICAgICAgIGN0eDsKKworICAgICAgICAgICAgICAgIGVnbF9zdXJmYWNlX3QoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIGludDMyX3QgZGVwdGhGb3JtYXQpOworICAgIHZpcnR1YWwgICAgIH5lZ2xfc3VyZmFjZV90KCk7CisgICAgdmlydHVhbCAgICAgYm9vbCAgICBpc1ZhbGlkKCkgY29uc3QgPSAwOworICAgIAorICAgIHZpcnR1YWwgICAgIEVHTEJvb2xlYW4gIGJpbmREcmF3U3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKSA9IDA7CisgICAgdmlydHVhbCAgICAgRUdMQm9vbGVhbiAgYmluZFJlYWRTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpID0gMDsKKyAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRXaWR0aCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRIZWlnaHQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCAgICAgdm9pZCogICAgICAgZ2V0Qml0cygpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldEhvcml6b250YWxSZXNvbHV0aW9uKCkgY29uc3Q7CisgICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0VmVydGljYWxSZXNvbHV0aW9uKCkgY29uc3Q7CisgICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0UmVmcmVzaFJhdGUoKSBjb25zdDsKKyAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRTd2FwQmVoYXZpb3IoKSBjb25zdDsKKyAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBzd2FwQnVmZmVycygpOworcHJvdGVjdGVkOgorICAgIEdHTFN1cmZhY2UgICAgICAgICAgICAgIGRlcHRoOworfTsKKworZWdsX3N1cmZhY2VfdDo6ZWdsX3N1cmZhY2VfdChFR0xEaXNwbGF5IGRweSwKKyAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgaW50MzJfdCBkZXB0aEZvcm1hdCkKKyAgICA6IG1hZ2ljKE1BR0lDKSwgZHB5KGRweSksIGNvbmZpZyhjb25maWcpLCBjdHgoMCkKK3sKKyAgICBkZXB0aC52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOworICAgIGRlcHRoLmRhdGEgPSAwOworICAgIGRlcHRoLmZvcm1hdCA9IGRlcHRoRm9ybWF0OworfQorZWdsX3N1cmZhY2VfdDo6fmVnbF9zdXJmYWNlX3QoKQoreworICAgIG1hZ2ljID0gMDsKKyAgICBmcmVlKGRlcHRoLmRhdGEpOworfQorRUdMQm9vbGVhbiBlZ2xfc3VyZmFjZV90Ojpzd2FwQnVmZmVycygpIHsKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorRUdMaW50IGVnbF9zdXJmYWNlX3Q6OmdldEhvcml6b250YWxSZXNvbHV0aW9uKCkgY29uc3QgeworICAgIHJldHVybiAoMCAqIEVHTF9ESVNQTEFZX1NDQUxJTkcpICogKDEuMGYgLyAyNS40Zik7Cit9CitFR0xpbnQgZWdsX3N1cmZhY2VfdDo6Z2V0VmVydGljYWxSZXNvbHV0aW9uKCkgY29uc3QgeworICAgIHJldHVybiAoMCAqIEVHTF9ESVNQTEFZX1NDQUxJTkcpICogKDEuMGYgLyAyNS40Zik7Cit9CitFR0xpbnQgZWdsX3N1cmZhY2VfdDo6Z2V0UmVmcmVzaFJhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuICg2MCAqIEVHTF9ESVNQTEFZX1NDQUxJTkcpOworfQorRUdMaW50IGVnbF9zdXJmYWNlX3Q6OmdldFN3YXBCZWhhdmlvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gRUdMX0JVRkZFUl9QUkVTRVJWRUQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGVnbF93aW5kb3dfc3VyZmFjZV90IDogcHVibGljIGVnbF9zdXJmYWNlX3QKK3sKKyAgICBlZ2xfd2luZG93X3N1cmZhY2VfdCgKKyAgICAgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICAgICAgaW50MzJfdCBkZXB0aEZvcm1hdCwKKyAgICAgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3QqIHdpbmRvdyk7CisKKyAgICAgfmVnbF93aW5kb3dfc3VyZmFjZV90KCk7CisKKyAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbmF0aXZlV2luZG93LT5tYWdpYyA9PSAweDYwMDkxMzsgfSAgICAKKyAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBzd2FwQnVmZmVycygpOworICAgIHZpcnR1YWwgICAgIEVHTEJvb2xlYW4gIGJpbmREcmF3U3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKTsKKyAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBiaW5kUmVhZFN1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCk7CisgICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0V2lkdGgoKSBjb25zdCAgICB7IHJldHVybiBuYXRpdmVXaW5kb3ctPndpZHRoOyAgfQorICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldEhlaWdodCgpIGNvbnN0ICAgeyByZXR1cm4gbmF0aXZlV2luZG93LT5oZWlnaHQ7IH0KKyAgICB2aXJ0dWFsICAgICB2b2lkKiAgICAgICBnZXRCaXRzKCkgY29uc3Q7CisgICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0SG9yaXpvbnRhbFJlc29sdXRpb24oKSBjb25zdDsKKyAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRWZXJ0aWNhbFJlc29sdXRpb24oKSBjb25zdDsKKyAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRSZWZyZXNoUmF0ZSgpIGNvbnN0OworICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldFN3YXBCZWhhdmlvcigpIGNvbnN0OworcHJpdmF0ZToKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190KiAgICBuYXRpdmVXaW5kb3c7Cit9OworCitlZ2xfd2luZG93X3N1cmZhY2VfdDo6ZWdsX3dpbmRvd19zdXJmYWNlX3QoRUdMRGlzcGxheSBkcHksCisgICAgICAgIEVHTENvbmZpZyBjb25maWcsCisgICAgICAgIGludDMyX3QgZGVwdGhGb3JtYXQsCisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3QqIHdpbmRvdykKKyAgICA6IGVnbF9zdXJmYWNlX3QoZHB5LCBjb25maWcsIGRlcHRoRm9ybWF0KSwgbmF0aXZlV2luZG93KHdpbmRvdykKK3sKKyAgICBpZiAoZGVwdGhGb3JtYXQpIHsKKyAgICAgICAgZGVwdGgud2lkdGggICA9IHdpbmRvdy0+d2lkdGg7CisgICAgICAgIGRlcHRoLmhlaWdodCAgPSB3aW5kb3ctPmhlaWdodDsKKyAgICAgICAgZGVwdGguc3RyaWRlICA9IGRlcHRoLndpZHRoOyAvLyB1c2UgdGhlIHdpZHRoIGhlcmUKKyAgICAgICAgZGVwdGguZGF0YSAgICA9IChHR0x1Ynl0ZSopbWFsbG9jKGRlcHRoLnN0cmlkZSpkZXB0aC5oZWlnaHQqMik7CisgICAgICAgIGlmIChkZXB0aC5kYXRhID09IDApIHsKKyAgICAgICAgICAgIHNldEVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9OT19TVVJGQUNFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBuYXRpdmVXaW5kb3ctPmluY1JlZihuYXRpdmVXaW5kb3cpOworfQorZWdsX3dpbmRvd19zdXJmYWNlX3Q6On5lZ2xfd2luZG93X3N1cmZhY2VfdCgpIHsKKyAgICBuYXRpdmVXaW5kb3ctPmRlY1JlZihuYXRpdmVXaW5kb3cpOworfQorCitFR0xCb29sZWFuIGVnbF93aW5kb3dfc3VyZmFjZV90Ojpzd2FwQnVmZmVycygpCit7CisgICAgdWludDMyX3QgZmxhZ3MgPSBuYXRpdmVXaW5kb3ctPnN3YXBCdWZmZXJzKG5hdGl2ZVdpbmRvdyk7CisgICAgaWYgKGZsYWdzICYgRUdMX05BVElWRVNfRkxBR19TSVpFX0NIQU5HRUQpIHsKKyAgICAgICAgLy8gVE9ETzogd2UgcHJvYmFibHkgc2hvdWxkIHJlc2V0IHRoZSBzd2FwIHJlY3QgaGVyZQorICAgICAgICAvLyBpZiB0aGUgd2luZG93IHNpemUgaGFzIGNoYW5nZWQKKyAgICAgICAgaWYgKGRlcHRoLmRhdGEpIHsKKyAgICAgICAgICAgIGZyZWUoZGVwdGguZGF0YSk7CisgICAgICAgICAgICBkZXB0aC53aWR0aCAgID0gbmF0aXZlV2luZG93LT53aWR0aDsKKyAgICAgICAgICAgIGRlcHRoLmhlaWdodCAgPSBuYXRpdmVXaW5kb3ctPmhlaWdodDsKKyAgICAgICAgICAgIGRlcHRoLnN0cmlkZSAgPSBuYXRpdmVXaW5kb3ctPnN0cmlkZTsKKyAgICAgICAgICAgIGRlcHRoLmRhdGEgICAgPSAoR0dMdWJ5dGUqKW1hbGxvYyhkZXB0aC5zdHJpZGUqZGVwdGguaGVpZ2h0KjIpOworICAgICAgICAgICAgaWYgKGRlcHRoLmRhdGEgPT0gMCkgeworICAgICAgICAgICAgICAgIHNldEVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9OT19TVVJGQUNFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworRUdMQm9vbGVhbiBlZ2xfd2luZG93X3N1cmZhY2VfdDo6YmluZERyYXdTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpCit7CisgICAgR0dMU3VyZmFjZSBidWZmZXI7CisgICAgYnVmZmVyLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7CisgICAgYnVmZmVyLndpZHRoICAgPSBuYXRpdmVXaW5kb3ctPndpZHRoOworICAgIGJ1ZmZlci5oZWlnaHQgID0gbmF0aXZlV2luZG93LT5oZWlnaHQ7CisgICAgYnVmZmVyLnN0cmlkZSAgPSBuYXRpdmVXaW5kb3ctPnN0cmlkZTsKKyAgICBidWZmZXIuZGF0YSAgICA9IChHR0x1Ynl0ZSopbmF0aXZlV2luZG93LT5iYXNlICsgbmF0aXZlV2luZG93LT5vZmZzZXQ7CisgICAgYnVmZmVyLmZvcm1hdCAgPSBuYXRpdmVXaW5kb3ctPmZvcm1hdDsKKyAgICBnbC0+cmFzdGVyaXplci5wcm9jcy5jb2xvckJ1ZmZlcihnbCwgJmJ1ZmZlcik7CisgICAgaWYgKGRlcHRoLmRhdGEgIT0gZ2wtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5kZXB0aC5kYXRhKQorICAgICAgICBnbC0+cmFzdGVyaXplci5wcm9jcy5kZXB0aEJ1ZmZlcihnbCwgJmRlcHRoKTsKKyAgICByZXR1cm4gRUdMX1RSVUU7Cit9CitFR0xCb29sZWFuIGVnbF93aW5kb3dfc3VyZmFjZV90OjpiaW5kUmVhZFN1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCkKK3sKKyAgICBHR0xTdXJmYWNlIGJ1ZmZlcjsKKyAgICBidWZmZXIudmVyc2lvbiA9IHNpemVvZihHR0xTdXJmYWNlKTsKKyAgICBidWZmZXIud2lkdGggICA9IG5hdGl2ZVdpbmRvdy0+d2lkdGg7CisgICAgYnVmZmVyLmhlaWdodCAgPSBuYXRpdmVXaW5kb3ctPmhlaWdodDsKKyAgICBidWZmZXIuc3RyaWRlICA9IG5hdGl2ZVdpbmRvdy0+c3RyaWRlOworICAgIGJ1ZmZlci5kYXRhICAgID0gKEdHTHVieXRlKiluYXRpdmVXaW5kb3ctPmJhc2UgKyBuYXRpdmVXaW5kb3ctPm9mZnNldDsKKyAgICBidWZmZXIuZm9ybWF0ICA9IG5hdGl2ZVdpbmRvdy0+Zm9ybWF0OworICAgIGdsLT5yYXN0ZXJpemVyLnByb2NzLnJlYWRCdWZmZXIoZ2wsICZidWZmZXIpOworICAgIHJldHVybiBFR0xfVFJVRTsKK30KK3ZvaWQqIGVnbF93aW5kb3dfc3VyZmFjZV90OjpnZXRCaXRzKCkgY29uc3QgeworICAgIHJldHVybiAoR0dMdWJ5dGUqKW5hdGl2ZVdpbmRvdy0+YmFzZSArIG5hdGl2ZVdpbmRvdy0+b2Zmc2V0OworfQorRUdMaW50IGVnbF93aW5kb3dfc3VyZmFjZV90OjpnZXRIb3Jpem9udGFsUmVzb2x1dGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gKG5hdGl2ZVdpbmRvdy0+eGRwaSAqIEVHTF9ESVNQTEFZX1NDQUxJTkcpICogKDEuMGYgLyAyNS40Zik7Cit9CitFR0xpbnQgZWdsX3dpbmRvd19zdXJmYWNlX3Q6OmdldFZlcnRpY2FsUmVzb2x1dGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gKG5hdGl2ZVdpbmRvdy0+eWRwaSAqIEVHTF9ESVNQTEFZX1NDQUxJTkcpICogKDEuMGYgLyAyNS40Zik7Cit9CitFR0xpbnQgZWdsX3dpbmRvd19zdXJmYWNlX3Q6OmdldFJlZnJlc2hSYXRlKCkgY29uc3QgeworICAgIHJldHVybiAobmF0aXZlV2luZG93LT5mcHMgKiBFR0xfRElTUExBWV9TQ0FMSU5HKTsKK30KK0VHTGludCBlZ2xfd2luZG93X3N1cmZhY2VfdDo6Z2V0U3dhcEJlaGF2aW9yKCkgY29uc3QgeworICAgIHVpbnQzMl90IGZsYWdzID0gbmF0aXZlV2luZG93LT5mbGFnczsKKyAgICBpZiAoZmxhZ3MgJiBFR0xfTkFUSVZFU19GTEFHX0RFU1RST1lfQkFDS0JVRkZFUikKKyAgICAgICAgcmV0dXJuIEVHTF9CVUZGRVJfREVTVFJPWUVEOworICAgIHJldHVybiBFR0xfQlVGRkVSX1BSRVNFUlZFRDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3QgZWdsX3BpeG1hcF9zdXJmYWNlX3QgOiBwdWJsaWMgZWdsX3N1cmZhY2VfdAoreworICAgIGVnbF9waXhtYXBfc3VyZmFjZV90KAorICAgICAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCisgICAgICAgICAgICBpbnQzMl90IGRlcHRoRm9ybWF0LAorICAgICAgICAgICAgZWdsX25hdGl2ZV9waXhtYXBfdCBjb25zdCAqIHBpeG1hcCk7CisKKyAgICB2aXJ0dWFsIH5lZ2xfcGl4bWFwX3N1cmZhY2VfdCgpIHsgfQorCisgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG5hdGl2ZVBpeG1hcC52ZXJzaW9uID09IHNpemVvZihlZ2xfbmF0aXZlX3BpeG1hcF90KTsgfSAgICAKKyAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBiaW5kRHJhd1N1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCk7CisgICAgdmlydHVhbCAgICAgRUdMQm9vbGVhbiAgYmluZFJlYWRTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpOworICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldFdpZHRoKCkgY29uc3QgICAgeyByZXR1cm4gbmF0aXZlUGl4bWFwLndpZHRoOyAgfQorICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldEhlaWdodCgpIGNvbnN0ICAgeyByZXR1cm4gbmF0aXZlUGl4bWFwLmhlaWdodDsgfQorICAgIHZpcnR1YWwgICAgIHZvaWQqICAgICAgIGdldEJpdHMoKSBjb25zdCAgICAgeyByZXR1cm4gbmF0aXZlUGl4bWFwLmRhdGE7IH0KK3ByaXZhdGU6CisgICAgZWdsX25hdGl2ZV9waXhtYXBfdCAgICAgbmF0aXZlUGl4bWFwOworfTsKKworZWdsX3BpeG1hcF9zdXJmYWNlX3Q6OmVnbF9waXhtYXBfc3VyZmFjZV90KEVHTERpc3BsYXkgZHB5LAorICAgICAgICBFR0xDb25maWcgY29uZmlnLAorICAgICAgICBpbnQzMl90IGRlcHRoRm9ybWF0LAorICAgICAgICBlZ2xfbmF0aXZlX3BpeG1hcF90IGNvbnN0ICogcGl4bWFwKQorICAgIDogZWdsX3N1cmZhY2VfdChkcHksIGNvbmZpZywgZGVwdGhGb3JtYXQpLCBuYXRpdmVQaXhtYXAoKnBpeG1hcCkKK3sKKyAgICBpZiAoZGVwdGhGb3JtYXQpIHsKKyAgICAgICAgZGVwdGgud2lkdGggICA9IHBpeG1hcC0+d2lkdGg7CisgICAgICAgIGRlcHRoLmhlaWdodCAgPSBwaXhtYXAtPmhlaWdodDsKKyAgICAgICAgZGVwdGguc3RyaWRlICA9IGRlcHRoLndpZHRoOyAvLyB1c2UgdGhlIHdpZHRoIGhlcmUKKyAgICAgICAgZGVwdGguZGF0YSAgICA9IChHR0x1Ynl0ZSopbWFsbG9jKGRlcHRoLnN0cmlkZSpkZXB0aC5oZWlnaHQqMik7CisgICAgICAgIGlmIChkZXB0aC5kYXRhID09IDApIHsKKyAgICAgICAgICAgIHNldEVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9OT19TVVJGQUNFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KK0VHTEJvb2xlYW4gZWdsX3BpeG1hcF9zdXJmYWNlX3Q6OmJpbmREcmF3U3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKQoreworICAgIEdHTFN1cmZhY2UgYnVmZmVyOworICAgIGJ1ZmZlci52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOworICAgIGJ1ZmZlci53aWR0aCAgID0gbmF0aXZlUGl4bWFwLndpZHRoOworICAgIGJ1ZmZlci5oZWlnaHQgID0gbmF0aXZlUGl4bWFwLmhlaWdodDsKKyAgICBidWZmZXIuc3RyaWRlICA9IG5hdGl2ZVBpeG1hcC5zdHJpZGU7CisgICAgYnVmZmVyLmRhdGEgICAgPSBuYXRpdmVQaXhtYXAuZGF0YTsKKyAgICBidWZmZXIuZm9ybWF0ICA9IG5hdGl2ZVBpeG1hcC5mb3JtYXQ7CisgICAgCisgICAgZ2wtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3JCdWZmZXIoZ2wsICZidWZmZXIpOworICAgIGlmIChkZXB0aC5kYXRhICE9IGdsLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuZGVwdGguZGF0YSkKKyAgICAgICAgZ2wtPnJhc3Rlcml6ZXIucHJvY3MuZGVwdGhCdWZmZXIoZ2wsICZkZXB0aCk7CisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorRUdMQm9vbGVhbiBlZ2xfcGl4bWFwX3N1cmZhY2VfdDo6YmluZFJlYWRTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpCit7CisgICAgR0dMU3VyZmFjZSBidWZmZXI7CisgICAgYnVmZmVyLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7CisgICAgYnVmZmVyLndpZHRoICAgPSBuYXRpdmVQaXhtYXAud2lkdGg7CisgICAgYnVmZmVyLmhlaWdodCAgPSBuYXRpdmVQaXhtYXAuaGVpZ2h0OworICAgIGJ1ZmZlci5zdHJpZGUgID0gbmF0aXZlUGl4bWFwLnN0cmlkZTsKKyAgICBidWZmZXIuZGF0YSAgICA9IG5hdGl2ZVBpeG1hcC5kYXRhOworICAgIGJ1ZmZlci5mb3JtYXQgID0gbmF0aXZlUGl4bWFwLmZvcm1hdDsKKyAgICBnbC0+cmFzdGVyaXplci5wcm9jcy5yZWFkQnVmZmVyKGdsLCAmYnVmZmVyKTsKKyAgICByZXR1cm4gRUdMX1RSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGVnbF9wYnVmZmVyX3N1cmZhY2VfdCA6IHB1YmxpYyBlZ2xfc3VyZmFjZV90Cit7CisgICAgZWdsX3BidWZmZXJfc3VyZmFjZV90KAorICAgICAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIGludDMyX3QgZGVwdGhGb3JtYXQsCisgICAgICAgICAgICBpbnQzMl90IHcsIGludDMyX3QgaCwgaW50MzJfdCBmKTsKKworICAgIHZpcnR1YWwgfmVnbF9wYnVmZmVyX3N1cmZhY2VfdCgpOworCisgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIHBidWZmZXIuZGF0YSAhPSAwOyB9ICAgIAorICAgIHZpcnR1YWwgICAgIEVHTEJvb2xlYW4gIGJpbmREcmF3U3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKTsKKyAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBiaW5kUmVhZFN1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCk7CisgICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0V2lkdGgoKSBjb25zdCAgICB7IHJldHVybiBwYnVmZmVyLndpZHRoOyAgfQorICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldEhlaWdodCgpIGNvbnN0ICAgeyByZXR1cm4gcGJ1ZmZlci5oZWlnaHQ7IH0KKyAgICB2aXJ0dWFsICAgICB2b2lkKiAgICAgICBnZXRCaXRzKCkgY29uc3QgICAgIHsgcmV0dXJuIHBidWZmZXIuZGF0YTsgfQorcHJpdmF0ZToKKyAgICBHR0xTdXJmYWNlICBwYnVmZmVyOworfTsKKworZWdsX3BidWZmZXJfc3VyZmFjZV90OjplZ2xfcGJ1ZmZlcl9zdXJmYWNlX3QoRUdMRGlzcGxheSBkcHksCisgICAgICAgIEVHTENvbmZpZyBjb25maWcsIGludDMyX3QgZGVwdGhGb3JtYXQsCisgICAgICAgIGludDMyX3QgdywgaW50MzJfdCBoLCBpbnQzMl90IGYpCisgICAgOiBlZ2xfc3VyZmFjZV90KGRweSwgY29uZmlnLCBkZXB0aEZvcm1hdCkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IHcqaDsKKyAgICBzd2l0Y2ggKGYpIHsKKyAgICAgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX0FfODogICAgICAgICAgc2l6ZSAqPSAxOyBicmVhazsKKyAgICAgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQl81NjU6ICAgICAgc2l6ZSAqPSAyOyBicmVhazsKKyAgICAgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4ODogICAgc2l6ZSAqPSA0OyBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoImluY29tcGF0aWJsZSBwaXhlbCBmb3JtYXQgZm9yIHBidWZmZXIgKGZvcm1hdD0lZCkiLCBmKTsKKyAgICAgICAgICAgIHBidWZmZXIuZGF0YSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcGJ1ZmZlci52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOworICAgIHBidWZmZXIud2lkdGggICA9IHc7CisgICAgcGJ1ZmZlci5oZWlnaHQgID0gaDsKKyAgICBwYnVmZmVyLnN0cmlkZSAgPSB3OworICAgIHBidWZmZXIuZGF0YSAgICA9IChHR0x1Ynl0ZSopbWFsbG9jKHNpemUpOworICAgIHBidWZmZXIuZm9ybWF0ICA9IGY7CisgICAgCisgICAgaWYgKGRlcHRoRm9ybWF0KSB7CisgICAgICAgIGRlcHRoLndpZHRoICAgPSBwYnVmZmVyLndpZHRoOworICAgICAgICBkZXB0aC5oZWlnaHQgID0gcGJ1ZmZlci5oZWlnaHQ7CisgICAgICAgIGRlcHRoLnN0cmlkZSAgPSBkZXB0aC53aWR0aDsgLy8gdXNlIHRoZSB3aWR0aCBoZXJlCisgICAgICAgIGRlcHRoLmRhdGEgICAgPSAoR0dMdWJ5dGUqKW1hbGxvYyhkZXB0aC5zdHJpZGUqZGVwdGguaGVpZ2h0KjIpOworICAgICAgICBpZiAoZGVwdGguZGF0YSA9PSAwKSB7CisgICAgICAgICAgICBzZXRFcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfTk9fU1VSRkFDRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CitlZ2xfcGJ1ZmZlcl9zdXJmYWNlX3Q6On5lZ2xfcGJ1ZmZlcl9zdXJmYWNlX3QoKSB7CisgICAgZnJlZShwYnVmZmVyLmRhdGEpOworfQorRUdMQm9vbGVhbiBlZ2xfcGJ1ZmZlcl9zdXJmYWNlX3Q6OmJpbmREcmF3U3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKQoreworICAgIGdsLT5yYXN0ZXJpemVyLnByb2NzLmNvbG9yQnVmZmVyKGdsLCAmcGJ1ZmZlcik7CisgICAgaWYgKGRlcHRoLmRhdGEgIT0gZ2wtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5kZXB0aC5kYXRhKQorICAgICAgICBnbC0+cmFzdGVyaXplci5wcm9jcy5kZXB0aEJ1ZmZlcihnbCwgJmRlcHRoKTsKKyAgICByZXR1cm4gRUdMX1RSVUU7Cit9CitFR0xCb29sZWFuIGVnbF9wYnVmZmVyX3N1cmZhY2VfdDo6YmluZFJlYWRTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpCit7CisgICAgZ2wtPnJhc3Rlcml6ZXIucHJvY3MucmVhZEJ1ZmZlcihnbCwgJnBidWZmZXIpOworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3QgY29uZmlnX3BhaXJfdCB7CisgICAgR0xpbnQga2V5OworICAgIEdMaW50IHZhbHVlOworfTsKKworc3RydWN0IGNvbmZpZ3NfdCB7CisgICAgY29uc3QgY29uZmlnX3BhaXJfdCogYXJyYXk7CisgICAgaW50ICAgICAgICAgICAgICAgICAgc2l6ZTsKK307CisKK3N0cnVjdCBjb25maWdfbWFuYWdlbWVudF90IHsKKyAgICBHTGludCBrZXk7CisgICAgYm9vbCAoKm1hdGNoKShHTGludCByZXFWYWx1ZSwgR0xpbnQgY29uZlZhbHVlKTsKKyAgICBzdGF0aWMgYm9vbCBhdExlYXN0KEdMaW50IHJlcVZhbHVlLCBHTGludCBjb25mVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIChyZXFWYWx1ZSA9PSBFR0xfRE9OVF9DQVJFKSB8fCAoY29uZlZhbHVlID49IHJlcVZhbHVlKTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgZXhhY3QoR0xpbnQgcmVxVmFsdWUsIEdMaW50IGNvbmZWYWx1ZSkgeworICAgICAgICByZXR1cm4gKHJlcVZhbHVlID09IEVHTF9ET05UX0NBUkUpIHx8IChjb25mVmFsdWUgPT0gcmVxVmFsdWUpOworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBtYXNrKEdMaW50IHJlcVZhbHVlLCBHTGludCBjb25mVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIChjb25mVmFsdWUgJiByZXFWYWx1ZSkgPT0gcmVxVmFsdWU7CisgICAgfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIFZFUlNJT05fTUFKT1IgMQorI2RlZmluZSBWRVJTSU9OX01JTk9SIDIKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ1ZlbmRvclN0cmluZyAgICAgPSAiR29vZ2xlIEluYy4iOworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnVmVyc2lvblN0cmluZyAgICA9ICIxLjIgQW5kcm9pZCBEcml2ZXIiOworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnQ2xpZW50QXBpU3RyaW5nICA9ICJPcGVuR0wgRVMiOworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnRXh0ZW5zaW9uc1N0cmluZyA9ICIiOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBleHRlbnRpb25fbWFwX3QgeworICAgIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lOworICAgIF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUgYWRkcmVzczsKK307CisKK3N0YXRpYyBjb25zdCBleHRlbnRpb25fbWFwX3QgZ0V4dGVudGlvbk1hcFtdID0geworICAgIHsgImdsRHJhd1RleHNPRVMiLCAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4c09FUyB9LAorICAgIHsgImdsRHJhd1RleGlPRVMiLCAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4aU9FUyB9LAorICAgIHsgImdsRHJhd1RleGZPRVMiLCAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4Zk9FUyB9LAorICAgIHsgImdsRHJhd1RleHhPRVMiLCAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4eE9FUyB9LAorICAgIHsgImdsRHJhd1RleHN2T0VTIiwgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4c3ZPRVMgfSwKKyAgICB7ICJnbERyYXdUZXhpdk9FUyIsICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleGl2T0VTIH0sCisgICAgeyAiZ2xEcmF3VGV4ZnZPRVMiLCAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhmdk9FUyB9LAorICAgIHsgImdsRHJhd1RleHh2T0VTIiwgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4eHZPRVMgfSwKKyAgICB7ICJnbFF1ZXJ5TWF0cml4eE9FUyIsICAgICAgICAgICh2b2lkKCopKCkpJmdsUXVlcnlNYXRyaXh4T0VTIH0sCisgICAgeyAiZ2xDbGlwUGxhbmVmIiwgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbENsaXBQbGFuZWYgfSwKKyAgICB7ICJnbENsaXBQbGFuZXgiLCAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQ2xpcFBsYW5leCB9LAorICAgIHsgImdsQmluZEJ1ZmZlciIsICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xCaW5kQnVmZmVyIH0sCisgICAgeyAiZ2xCdWZmZXJEYXRhIiwgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbEJ1ZmZlckRhdGEgfSwKKyAgICB7ICJnbEJ1ZmZlclN1YkRhdGEiLCAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQnVmZmVyU3ViRGF0YSB9LAorICAgIHsgImdsRGVsZXRlQnVmZmVycyIsICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEZWxldGVCdWZmZXJzIH0sCisgICAgeyAiZ2xHZW5CdWZmZXJzIiwgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbEdlbkJ1ZmZlcnMgfSwKK307CisKKy8qIAorICogSW4gdGhlIGxpc3RzIGJlbG93LCBhdHRyaWJ1dGVzIG5hbWVzIE1VU1QgYmUgc29ydGVkLgorICogQWRkaXRpb25hbGx5LCBhbGwgY29uZmlncyBtdXN0IGJlIHNvcnRlZCBhY2NvcmRpbmcgdG8KKyAqIHRoZSBFR0wgc3BlY2lmaWNhdGlvbi4KKyAqLworCitzdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfYmFzZV9hdHRyaWJ1dGVfbGlzdFtdID0geworICAgICAgICB7IEVHTF9TVEVOQ0lMX1NJWkUsICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX0NPTkZJR19DQVZFQVQsICAgICAgICAgICAgICBFR0xfU0xPV19DT05GSUcgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgeyBFR0xfTEVWRUwsICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICB7IEVHTF9NQVhfUEJVRkZFUl9IRUlHSFQsICAgICAgICAgR0dMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX01BWF9QQlVGRkVSX1BJWEVMUywgICAgICAgICAKKyAgICAgICAgICAgICAgICBHR0xfTUFYX1ZJRVdQT1JUX0RJTVMqR0dMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgICAgICB9LAorICAgICAgICB7IEVHTF9NQVhfUEJVRkZFUl9XSURUSCwgICAgICAgICAgR0dMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX05BVElWRV9SRU5ERVJBQkxFLCAgICAgICAgICBFR0xfVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgeyBFR0xfTkFUSVZFX1ZJU1VBTF9JRCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICB7IEVHTF9OQVRJVkVfVklTVUFMX1RZUEUsICAgICAgICAgR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1ICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX1NBTVBMRVMsICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgeyBFR0xfU0FNUExFX0JVRkZFUlMsICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICB7IEVHTF9UUkFOU1BBUkVOVF9UWVBFLCAgICAgICAgICAgRUdMX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUsICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgeyBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUsICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICB7IEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUsICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBLCAgICAgICBFR0xfRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgeyBFR0xfQklORF9UT19URVhUVVJFX1JHQiwgICAgICAgIEVHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICB7IEVHTF9NSU5fU1dBUF9JTlRFUlZBTCwgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX01BWF9TV0FQX0lOVEVSVkFMLCAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKK307CisKKy8vIFRoZXNlIGNvbmZpZ3MgY2FuIG92ZXJyaWRlIHRoZSBiYXNlIGF0dHJpYnV0ZSBsaXN0CisvLyBOT1RFOiB3aGVuIGFkZGluZyBhIGNvbmZpZyBoZXJlLCBkb24ndCBmb3JnZXQgdG8gdXBkYXRlIGVnbENyZWF0ZSpTdXJmYWNlKCkKKworc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzBfYXR0cmlidXRlX2xpc3RbXSA9IHsKKyAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAxNiB9LAorICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDUgfSwKKyAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgNiB9LAorICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICA1IH0sCisgICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKK307CisKK3N0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ18xX2F0dHJpYnV0ZV9saXN0W10gPSB7CisgICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgMTYgfSwKKyAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICA1IH0sCisgICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDYgfSwKKyAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgNSB9LAorICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgIDE2IH0sCisgICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDEgfSwKKyAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCit9OworCitzdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfMl9hdHRyaWJ1dGVfbGlzdFtdID0geworICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgIDMyIH0sCisgICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICAyIH0sCisgICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgIEVHTF9XSU5ET1dfQklUfEVHTF9QQlVGRkVSX0JJVHxFR0xfUElYTUFQX0JJVCB9LAorfTsKKworc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzNfYXR0cmlidXRlX2xpc3RbXSA9IHsKKyAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAzMiB9LAorICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgMTYgfSwKKyAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgMyB9LAorICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKK307CisKK3N0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ180X2F0dHJpYnV0ZV9saXN0W10gPSB7CisgICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDQgfSwKKyAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCit9OworCitzdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfNV9hdHRyaWJ1dGVfbGlzdFtdID0geworICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAxNiB9LAorICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICA1IH0sCisgICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgIEVHTF9XSU5ET1dfQklUfEVHTF9QQlVGRkVSX0JJVHxFR0xfUElYTUFQX0JJVCB9LAorfTsKKworc3RhdGljIGNvbmZpZ3NfdCBjb25zdCBnQ29uZmlnc1tdID0geworICAgICAgICB7IGNvbmZpZ18wX2F0dHJpYnV0ZV9saXN0LCBORUxFTShjb25maWdfMF9hdHRyaWJ1dGVfbGlzdCkgfSwKKyAgICAgICAgeyBjb25maWdfMV9hdHRyaWJ1dGVfbGlzdCwgTkVMRU0oY29uZmlnXzFfYXR0cmlidXRlX2xpc3QpIH0sCisgICAgICAgIHsgY29uZmlnXzJfYXR0cmlidXRlX2xpc3QsIE5FTEVNKGNvbmZpZ18yX2F0dHJpYnV0ZV9saXN0KSB9LAorICAgICAgICB7IGNvbmZpZ18zX2F0dHJpYnV0ZV9saXN0LCBORUxFTShjb25maWdfM19hdHRyaWJ1dGVfbGlzdCkgfSwKKyAgICAgICAgeyBjb25maWdfNF9hdHRyaWJ1dGVfbGlzdCwgTkVMRU0oY29uZmlnXzRfYXR0cmlidXRlX2xpc3QpIH0sCisgICAgICAgIHsgY29uZmlnXzVfYXR0cmlidXRlX2xpc3QsIE5FTEVNKGNvbmZpZ181X2F0dHJpYnV0ZV9saXN0KSB9LAorfTsKKworc3RhdGljIGNvbmZpZ19tYW5hZ2VtZW50X3QgY29uc3QgZ0NvbmZpZ01hbmFnZW1lbnRbXSA9IHsKKyAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKKyAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKKyAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKKyAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKKyAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKKyAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKKyAgICAgICAgeyBFR0xfU1RFTkNJTF9TSVpFLCAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmF0TGVhc3QgfSwKKyAgICAgICAgeyBFR0xfQ09ORklHX0NBVkVBVCwgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTEVWRUwsICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfSEVJR0hULCAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfUElYRUxTLCAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfV0lEVEgsICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTkFUSVZFX1JFTkRFUkFCTEUsICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTkFUSVZFX1ZJU1VBTF9JRCwgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFLCAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfU0FNUExFUywgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfU0FNUExFX0JVRkZFUlMsICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6Om1hc2sgICAgfSwKKyAgICAgICAgeyBFR0xfVFJBTlNQQVJFTlRfVFlQRSwgICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSwgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUsICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFLCAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfQklORF9UT19URVhUVVJFX1JHQkEsICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfQklORF9UT19URVhUVVJFX1JHQiwgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTUlOX1NXQVBfSU5URVJWQUwsICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKKyAgICAgICAgeyBFR0xfTUFYX1NXQVBfSU5URVJWQUwsICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6OmV4YWN0ICAgfSwKK307CisKK3N0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ19kZWZhdWx0c1tdID0geworICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICAgICBFR0xfV0lORE9XX0JJVCB9LAorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIGludCBiaW5hcnlTZWFyY2goVCBjb25zdCBzb3J0ZWRBcnJheVtdLCBpbnQgZmlyc3QsIGludCBsYXN0LCBFR0xpbnQga2V5KQoreworICAgd2hpbGUgKGZpcnN0IDw9IGxhc3QpIHsKKyAgICAgICBpbnQgbWlkID0gKGZpcnN0ICsgbGFzdCkgLyAyOworICAgICAgIGlmIChrZXkgPiBzb3J0ZWRBcnJheVttaWRdLmtleSkgeyAKKyAgICAgICAgICAgZmlyc3QgPSBtaWQgKyAxOworICAgICAgIH0gZWxzZSBpZiAoa2V5IDwgc29ydGVkQXJyYXlbbWlkXS5rZXkpIHsgCisgICAgICAgICAgIGxhc3QgPSBtaWQgLSAxOworICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIHJldHVybiBtaWQ7CisgICAgICAgfQorICAgfQorICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGlzQXR0cmlidXRlTWF0Y2hpbmcoaW50IGksIEVHTGludCBhdHRyLCBFR0xpbnQgdmFsKQoreworICAgIC8vIGxvb2sgZm9yIHRoZSBhdHRyaWJ1dGUgaW4gYWxsIG9mIG91ciBjb25maWdzCisgICAgY29uZmlnX3BhaXJfdCBjb25zdCogY29uZmlnRm91bmQgPSBnQ29uZmlnc1tpXS5hcnJheTsgCisgICAgaW50IGluZGV4ID0gYmluYXJ5U2VhcmNoPGNvbmZpZ19wYWlyX3Q+KAorICAgICAgICAgICAgZ0NvbmZpZ3NbaV0uYXJyYXksCisgICAgICAgICAgICAwLCBnQ29uZmlnc1tpXS5zaXplLTEsCisgICAgICAgICAgICBhdHRyKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIGNvbmZpZ0ZvdW5kID0gY29uZmlnX2Jhc2VfYXR0cmlidXRlX2xpc3Q7IAorICAgICAgICBpbmRleCA9IGJpbmFyeVNlYXJjaDxjb25maWdfcGFpcl90PigKKyAgICAgICAgICAgICAgICBjb25maWdfYmFzZV9hdHRyaWJ1dGVfbGlzdCwKKyAgICAgICAgICAgICAgICAwLCBORUxFTShjb25maWdfYmFzZV9hdHRyaWJ1dGVfbGlzdCktMSwKKyAgICAgICAgICAgICAgICBhdHRyKTsKKyAgICB9CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgLy8gYXR0cmlidXRlIGZvdW5kLCBjaGVjayBpZiB0aGlzIGNvbmZpZyBjb3VsZCBtYXRjaAorICAgICAgICBpbnQgY2ZnTWd0SW5kZXggPSBiaW5hcnlTZWFyY2g8Y29uZmlnX21hbmFnZW1lbnRfdD4oCisgICAgICAgICAgICAgICAgZ0NvbmZpZ01hbmFnZW1lbnQsCisgICAgICAgICAgICAgICAgMCwgTkVMRU0oZ0NvbmZpZ01hbmFnZW1lbnQpLTEsCisgICAgICAgICAgICAgICAgYXR0cik7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBib29sIG1hdGNoID0gZ0NvbmZpZ01hbmFnZW1lbnRbY2ZnTWd0SW5kZXhdLm1hdGNoKAorICAgICAgICAgICAgICAgICAgICB2YWwsIGNvbmZpZ0ZvdW5kW2luZGV4XS52YWx1ZSk7CisgICAgICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIGNvbmZpZyBtYXRjaGVzCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBhdHRyaWJ1dGUgbm90IGZvdW5kLiB0aGlzIHNob3VsZCBORVZFUiBoYXBwZW4uCisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBlcnJvciwgdGhpcyBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdAorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWtlQ3VycmVudChvZ2xlc19jb250ZXh0X3QqIGdsKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogY3VycmVudCA9IChvZ2xlc19jb250ZXh0X3QqKWdldEdsVGhyZWFkU3BlY2lmaWMoKTsKKyAgICBpZiAoZ2wpIHsKKyAgICAgICAgZWdsX2NvbnRleHRfdCogYyA9IGVnbF9jb250ZXh0X3Q6OmNvbnRleHQoZ2wpOworICAgICAgICBpZiAoYy0+ZmxhZ3MgJiBlZ2xfY29udGV4dF90OjpJU19DVVJSRU5UKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudCAhPSBnbCkgeworICAgICAgICAgICAgICAgIC8vIGl0IGlzIGFuIGVycm9yIHRvIHNldCBhIGNvbnRleHQgY3VycmVudCwgaWYgaXQncyBhbHJlYWR5CisgICAgICAgICAgICAgICAgLy8gY3VycmVudCB0byBhbm90aGVyIHRocmVhZAorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50KSB7CisgICAgICAgICAgICAgICAgLy8gbWFyayB0aGUgY3VycmVudCBjb250ZXh0IGFzIG5vdCBjdXJyZW50LCBhbmQgZmx1c2gKKyAgICAgICAgICAgICAgICBnbEZsdXNoKCk7CisgICAgICAgICAgICAgICAgZWdsX2NvbnRleHRfdDo6Y29udGV4dChjdXJyZW50KS0+ZmxhZ3MgJj0gfmVnbF9jb250ZXh0X3Q6OklTX0NVUlJFTlQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoYy0+ZmxhZ3MgJiBlZ2xfY29udGV4dF90OjpJU19DVVJSRU5UKSkgeworICAgICAgICAgICAgLy8gVGhlIGNvbnRleHQgaXMgbm90IGN1cnJlbnQsIG1ha2UgaXQgY3VycmVudCEKKyAgICAgICAgICAgIHNldEdsVGhyZWFkU3BlY2lmaWMoZ2wpOworICAgICAgICAgICAgYy0+ZmxhZ3MgfD0gZWdsX2NvbnRleHRfdDo6SVNfQ1VSUkVOVDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjdXJyZW50KSB7CisgICAgICAgICAgICAvLyBtYXJrIHRoZSBjdXJyZW50IGNvbnRleHQgYXMgbm90IGN1cnJlbnQsIGFuZCBmbHVzaAorICAgICAgICAgICAgZ2xGbHVzaCgpOworICAgICAgICAgICAgZWdsX2NvbnRleHRfdDo6Y29udGV4dChjdXJyZW50KS0+ZmxhZ3MgJj0gfmVnbF9jb250ZXh0X3Q6OklTX0NVUlJFTlQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gdGhpcyB0aHJlYWQgaGFzIG5vIGNvbnRleHQgYXR0YWNoZWQgdG8gaXQKKyAgICAgICAgc2V0R2xUaHJlYWRTcGVjaWZpYygwKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBFR0xCb29sZWFuIGdldENvbmZpZ0F0dHJpYihFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSkKK3sKKyAgICBzaXplX3QgbnVtQ29uZmlncyA9ICBORUxFTShnQ29uZmlncyk7CisgICAgaW50IGluZGV4ID0gKGludCljb25maWc7CisgICAgaWYgKHVpbnQzMl90KGluZGV4KSA+PSBudW1Db25maWdzKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05GSUcsIEVHTF9GQUxTRSk7CisKKyAgICBpbnQgYXR0ckluZGV4OworICAgIGF0dHJJbmRleCA9IGJpbmFyeVNlYXJjaDxjb25maWdfcGFpcl90PigKKyAgICAgICAgICAgIGdDb25maWdzW2luZGV4XS5hcnJheSwKKyAgICAgICAgICAgIDAsIGdDb25maWdzW2luZGV4XS5zaXplLTEsCisgICAgICAgICAgICBhdHRyaWJ1dGUpOworICAgIGlmIChhdHRySW5kZXg+PTApIHsKKyAgICAgICAgKnZhbHVlID0gZ0NvbmZpZ3NbaW5kZXhdLmFycmF5W2F0dHJJbmRleF0udmFsdWU7CisgICAgICAgIHJldHVybiBFR0xfVFJVRTsKKyAgICB9CisKKyAgICBhdHRySW5kZXggPSBiaW5hcnlTZWFyY2g8Y29uZmlnX3BhaXJfdD4oCisgICAgICAgICAgICBjb25maWdfYmFzZV9hdHRyaWJ1dGVfbGlzdCwKKyAgICAgICAgICAgIDAsIE5FTEVNKGNvbmZpZ19iYXNlX2F0dHJpYnV0ZV9saXN0KS0xLAorICAgICAgICAgICAgYXR0cmlidXRlKTsKKyAgICBpZiAoYXR0ckluZGV4Pj0wKSB7CisgICAgICAgICp2YWx1ZSA9IGNvbmZpZ19iYXNlX2F0dHJpYnV0ZV9saXN0W2F0dHJJbmRleF0udmFsdWU7CisgICAgICAgIHJldHVybiBFR0xfVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQVRUUklCVVRFLCBFR0xfRkFMU0UpOworfQorCitzdGF0aWMgRUdMU3VyZmFjZSBjcmVhdGVXaW5kb3dTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICBOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9OT19TVVJGQUNFKTsKKyAgICBpZiAod2luZG93ID09IDApCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7CisKKyAgICBFR0xpbnQgc3VyZmFjZVR5cGU7CisgICAgaWYgKGdldENvbmZpZ0F0dHJpYihkcHksIGNvbmZpZywgRUdMX1NVUkZBQ0VfVFlQRSwgJnN1cmZhY2VUeXBlKSA9PSBFR0xfRkFMU0UpCisgICAgICAgIHJldHVybiBFR0xfRkFMU0U7CisKKyAgICBpZiAoIShzdXJmYWNlVHlwZSAmIEVHTF9XSU5ET1dfQklUKSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKKworICAgIEVHTGludCBjb25maWdJRDsKKyAgICBpZiAoZ2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfQ09ORklHX0lELCAmY29uZmlnSUQpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKworICAgIGludDMyX3QgZGVwdGhGb3JtYXQ7CisgICAgaW50MzJfdCBwaXhlbEZvcm1hdDsKKyAgICBzd2l0Y2goY29uZmlnSUQpIHsKKyAgICBjYXNlIDA6IAorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7IAorICAgICAgICBkZXB0aEZvcm1hdCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4ODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9BXzg7IAorICAgICAgICBkZXB0aEZvcm1hdCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX0FfODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOworICAgIH0KKworICAgIC8vIEZJWE1FOiB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgcGl4ZWxGb3JtYXQgaGVyZSBqdXN0IHlldC4KKyAgICAvLyAoaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzdXJmYWNlIGlzIG5vdCBmdWxseSBpbml0aWFsaXplZCkKKyAgICAvLyBtYXliZSB0aGlzIHNob3VsZCBiZSBkb25lIGFmdGVyIHRoZSBwYWdlLWZsaXAKKyAgICAvL2lmIChFR0xpbnQoaW5mby5mb3JtYXQpICE9IHBpeGVsRm9ybWF0KQorICAgIC8vICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7CisKKyAgICBlZ2xfc3VyZmFjZV90KiBzdXJmYWNlID0KKyAgICAgICAgbmV3IGVnbF93aW5kb3dfc3VyZmFjZV90KGRweSwgY29uZmlnLCBkZXB0aEZvcm1hdCwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxlZ2xfbmF0aXZlX3dpbmRvd190Kj4od2luZG93KSk7CisKKyAgICBpZiAoIXN1cmZhY2UtPmlzVmFsaWQoKSkgeworICAgICAgICAvLyB0aGVyZSB3YXMgYSBwcm9ibGVtIGluIHRoZSBjdG9yLCB0aGUgZXJyb3IKKyAgICAgICAgLy8gZmxhZyBoYXMgYmVlbiBzZXQuCisgICAgICAgIGRlbGV0ZSBzdXJmYWNlOworICAgICAgICBzdXJmYWNlID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHN1cmZhY2U7Cit9CisKK3N0YXRpYyBFR0xTdXJmYWNlIGNyZWF0ZVBpeG1hcFN1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCisgICAgICAgIE5hdGl2ZVBpeG1hcFR5cGUgcGl4bWFwLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQoreworICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX05PX1NVUkZBQ0UpOworICAgIGlmIChwaXhtYXAgPT0gMCkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKKworICAgIEVHTGludCBzdXJmYWNlVHlwZTsKKyAgICBpZiAoZ2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfU1VSRkFDRV9UWVBFLCAmc3VyZmFjZVR5cGUpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKworICAgIGlmICghKHN1cmZhY2VUeXBlICYgRUdMX1BJWE1BUF9CSVQpKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOworCisgICAgRUdMaW50IGNvbmZpZ0lEOworICAgIGlmIChnZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIEVHTF9DT05GSUdfSUQsICZjb25maWdJRCkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOworCisgICAgaW50MzJfdCBkZXB0aEZvcm1hdDsKKyAgICBpbnQzMl90IHBpeGVsRm9ybWF0OworICAgIHN3aXRjaChjb25maWdJRCkgeworICAgIGNhc2UgMDogCisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4ODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX0FfODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfQV84OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7CisgICAgfQorCisgICAgaWYgKHBpeG1hcC0+Zm9ybWF0ICE9IHBpeGVsRm9ybWF0KQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOworCisgICAgZWdsX3N1cmZhY2VfdCogc3VyZmFjZSA9CisgICAgICAgIG5ldyBlZ2xfcGl4bWFwX3N1cmZhY2VfdChkcHksIGNvbmZpZywgZGVwdGhGb3JtYXQsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZWdsX25hdGl2ZV9waXhtYXBfdCo+KHBpeG1hcCkpOworCisgICAgaWYgKCFzdXJmYWNlLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgLy8gdGhlcmUgd2FzIGEgcHJvYmxlbSBpbiB0aGUgY3RvciwgdGhlIGVycm9yCisgICAgICAgIC8vIGZsYWcgaGFzIGJlZW4gc2V0LgorICAgICAgICBkZWxldGUgc3VyZmFjZTsKKyAgICAgICAgc3VyZmFjZSA9IDA7CisgICAgfQorICAgIHJldHVybiBzdXJmYWNlOworfQorCitzdGF0aWMgRUdMU3VyZmFjZSBjcmVhdGVQYnVmZmVyU3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9OT19TVVJGQUNFKTsKKworICAgIEVHTGludCBzdXJmYWNlVHlwZTsKKyAgICBpZiAoZ2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfU1VSRkFDRV9UWVBFLCAmc3VyZmFjZVR5cGUpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKyAgICAKKyAgICBpZiAoIShzdXJmYWNlVHlwZSAmIEVHTF9QQlVGRkVSX0JJVCkpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7CisgICAgICAgIAorICAgIEVHTGludCBjb25maWdJRDsKKyAgICBpZiAoZ2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfQ09ORklHX0lELCAmY29uZmlnSUQpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKworICAgIGludDMyX3QgZGVwdGhGb3JtYXQ7CisgICAgaW50MzJfdCBwaXhlbEZvcm1hdDsKKyAgICBzd2l0Y2goY29uZmlnSUQpIHsKKyAgICBjYXNlIDA6IAorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7IAorICAgICAgICBkZXB0aEZvcm1hdCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4ODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9BXzg7IAorICAgICAgICBkZXB0aEZvcm1hdCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX0FfODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOworICAgIH0KKworICAgIGludDMyX3QgdyA9IDA7CisgICAgaW50MzJfdCBoID0gMDsKKyAgICB3aGlsZSAoYXR0cmliX2xpc3RbMF0pIHsKKyAgICAgICAgaWYgKGF0dHJpYl9saXN0WzBdID09IEVHTF9XSURUSCkgIHcgPSBhdHRyaWJfbGlzdFsxXTsKKyAgICAgICAgaWYgKGF0dHJpYl9saXN0WzBdID09IEVHTF9IRUlHSFQpIGggPSBhdHRyaWJfbGlzdFsxXTsKKyAgICAgICAgYXR0cmliX2xpc3QrPTI7CisgICAgfQorCisgICAgZWdsX3N1cmZhY2VfdCogc3VyZmFjZSA9CisgICAgICAgIG5ldyBlZ2xfcGJ1ZmZlcl9zdXJmYWNlX3QoZHB5LCBjb25maWcsIGRlcHRoRm9ybWF0LCB3LCBoLCBwaXhlbEZvcm1hdCk7CisKKyAgICBpZiAoIXN1cmZhY2UtPmlzVmFsaWQoKSkgeworICAgICAgICAvLyB0aGVyZSB3YXMgYSBwcm9ibGVtIGluIHRoZSBjdG9yLCB0aGUgZXJyb3IKKyAgICAgICAgLy8gZmxhZyBoYXMgYmVlbiBzZXQuCisgICAgICAgIGRlbGV0ZSBzdXJmYWNlOworICAgICAgICBzdXJmYWNlID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHN1cmZhY2U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbml0aWFsaXphdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFR0xEaXNwbGF5IGVnbEdldERpc3BsYXkoTmF0aXZlRGlzcGxheVR5cGUgZGlzcGxheSkKK3sKKyNpZm5kZWYgSEFWRV9BTkRST0lEX09TCisgICAgLy8gdGhpcyBqdXN0IG5lZWRzIHRvIGJlIGRvbmUgb25jZQorICAgIGlmIChnR0xLZXkgPT0gLTEpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnSW5pdE11dGV4KTsKKyAgICAgICAgaWYgKGdHTEtleSA9PSAtMSkKKyAgICAgICAgICAgIHB0aHJlYWRfa2V5X2NyZWF0ZSgmZ0dMS2V5LCBOVUxMKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdJbml0TXV0ZXgpOworICAgIH0KKyNlbmRpZgorICAgIGlmIChkaXNwbGF5ID09IEVHTF9ERUZBVUxUX0RJU1BMQVkpIHsKKyAgICAgICAgRUdMRGlzcGxheSBkcHkgPSAoRUdMRGlzcGxheSkxOworICAgICAgICBlZ2xfZGlzcGxheV90JiBkID0gZWdsX2Rpc3BsYXlfdDo6Z2V0X2Rpc3BsYXkoZHB5KTsKKyAgICAgICAgZC50eXBlID0gZGlzcGxheTsKKyAgICAgICAgcmV0dXJuIGRweTsKKyAgICB9ICAgIAorICAgIHJldHVybiBFR0xfTk9fRElTUExBWTsKK30KKworRUdMQm9vbGVhbiBlZ2xJbml0aWFsaXplKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgKm1ham9yLCBFR0xpbnQgKm1pbm9yKQoreworICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKyAgICAKKyAgICBFR0xCb29sZWFuIHJlcyA9IEVHTF9UUlVFOworICAgIGVnbF9kaXNwbGF5X3QmIGQgPSBlZ2xfZGlzcGxheV90OjpnZXRfZGlzcGxheShkcHkpOworICAgIAorICAgIGlmIChhbmRyb2lkX2F0b21pY19pbmMoJmQuaW5pdGlhbGl6ZWQpID09IDApIHsKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBzdHVmZiBoZXJlIGlmIG5lZWRlZAorICAgICAgICAvL3B0aHJlYWRfbXV0ZXhfbG9jaygmZ0luaXRNdXRleCk7CisgICAgICAgIC8vcHRocmVhZF9tdXRleF91bmxvY2soJmdJbml0TXV0ZXgpOworICAgIH0KKworICAgIGlmIChyZXMgPT0gRUdMX1RSVUUpIHsKKyAgICAgICAgaWYgKG1ham9yICE9IE5VTEwpICptYWpvciA9IFZFUlNJT05fTUFKT1I7CisgICAgICAgIGlmIChtaW5vciAhPSBOVUxMKSAqbWlub3IgPSBWRVJTSU9OX01JTk9SOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitFR0xCb29sZWFuIGVnbFRlcm1pbmF0ZShFR0xEaXNwbGF5IGRweSkKK3sKKyAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisKKyAgICBFR0xCb29sZWFuIHJlcyA9IEVHTF9UUlVFOworICAgIGVnbF9kaXNwbGF5X3QmIGQgPSBlZ2xfZGlzcGxheV90OjpnZXRfZGlzcGxheShkcHkpOworICAgIGlmIChhbmRyb2lkX2F0b21pY19kZWMoJmQuaW5pdGlhbGl6ZWQpID09IDEpIHsKKyAgICAgICAgLy8gVE9ETzogZGVzdHJveSBhbGwgcmVzb3VyY2VzIChzdXJmYWNlcywgY29udGV4dHMsIGV0Yy4uLikKKyAgICAgICAgLy9wdGhyZWFkX211dGV4X2xvY2soJmdJbml0TXV0ZXgpOworICAgICAgICAvL3B0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnSW5pdE11dGV4KTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uZmlndXJhdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFR0xCb29sZWFuIGVnbEdldENvbmZpZ3MoICAgRUdMRGlzcGxheSBkcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMQ29uZmlnICpjb25maWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50ICpudW1fY29uZmlnKQoreworICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKworICAgIEdMaW50IG51bUNvbmZpZ3MgPSBORUxFTShnQ29uZmlncyk7CisgICAgaWYgKCFjb25maWdzKSB7CisgICAgICAgICpudW1fY29uZmlnID0gbnVtQ29uZmlnczsKKyAgICAgICAgcmV0dXJuIEVHTF9UUlVFOworICAgIH0KKyAgICBHTGludCBpOworICAgIGZvciAoaT0wIDsgaTxudW1Db25maWdzICYmIGk8Y29uZmlnX3NpemUgOyBpKyspIHsKKyAgICAgICAgKmNvbmZpZ3MrKyA9IChFR0xDb25maWcpaTsKKyAgICB9CisgICAgKm51bV9jb25maWcgPSBpOworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworRUdMQm9vbGVhbiBlZ2xDaG9vc2VDb25maWcoIEVHTERpc3BsYXkgZHB5LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTENvbmZpZyAqY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCAqbnVtX2NvbmZpZykKK3sKKyAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisKKyAgICBpZiAoZ2dsX3VubGlrZWx5KGNvbmZpZ3M9PTAgfHwgYXR0cmliX2xpc3Q9PTApKSB7CisgICAgICAgICpudW1fY29uZmlnID0gMDsKKyAgICAgICAgcmV0dXJuIEVHTF9UUlVFOworICAgIH0KKyAgICAKKyAgICBpbnQgbnVtQXR0cmlidXRlcyA9IDA7CisgICAgaW50IG51bUNvbmZpZ3MgPSAgTkVMRU0oZ0NvbmZpZ3MpOworICAgIHVpbnQzMl90IHBvc3NpYmxlTWF0Y2ggPSAoMTw8bnVtQ29uZmlncyktMTsKKyAgICB3aGlsZShwb3NzaWJsZU1hdGNoICYmICphdHRyaWJfbGlzdCAhPSBFR0xfTk9ORSkgeworICAgICAgICBudW1BdHRyaWJ1dGVzKys7CisgICAgICAgIEVHTGludCBhdHRyID0gKmF0dHJpYl9saXN0Kys7CisgICAgICAgIEVHTGludCB2YWwgID0gKmF0dHJpYl9saXN0Kys7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8bnVtQ29uZmlncyA7IGkrKykgeworICAgICAgICAgICAgaWYgKCEocG9zc2libGVNYXRjaCAmICgxPDxpKSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoaXNBdHRyaWJ1dGVNYXRjaGluZyhpLCBhdHRyLCB2YWwpID09IDApIHsKKyAgICAgICAgICAgICAgICBwb3NzaWJsZU1hdGNoICY9IH4oMTw8aSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBub3csIGhhbmRsZSB0aGUgYXR0cmlidXRlcyB3aGljaCBoYXZlIGEgdXNlZnVsIGRlZmF1bHQgdmFsdWUKKyAgICBmb3IgKHNpemVfdCBqPTAgOyBqPE5FTEVNKGNvbmZpZ19kZWZhdWx0cykgOyBqKyspIHsKKyAgICAgICAgLy8gc2VlIGlmIHRoaXMgYXR0cmlidXRlIHdhcyBzcGVjaWZpZWQsIGlmIG5vdCBhcHBseSBpdHMKKyAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZQorICAgICAgICBpZiAoYmluYXJ5U2VhcmNoPGNvbmZpZ19wYWlyX3Q+KAorICAgICAgICAgICAgICAgIChjb25maWdfcGFpcl90IGNvbnN0KilhdHRyaWJfbGlzdCwKKyAgICAgICAgICAgICAgICAwLCBudW1BdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgIGNvbmZpZ19kZWZhdWx0c1tqXS5rZXkpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wIDsgaTxudW1Db25maWdzIDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCEocG9zc2libGVNYXRjaCAmICgxPDxpKSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChpc0F0dHJpYnV0ZU1hdGNoaW5nKGksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfZGVmYXVsdHNbal0ua2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2RlZmF1bHRzW2pdLnZhbHVlKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zc2libGVNYXRjaCAmPSB+KDE8PGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHJldHVybiB0aGUgY29uZmlndXJhdGlvbnMgZm91bmQKKyAgICBpbnQgbj0wOworICAgIGlmIChwb3NzaWJsZU1hdGNoKSB7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGNvbmZpZ19zaXplICYmIGk8bnVtQ29uZmlncyA7IGkrKykgeworICAgICAgICAgICAgaWYgKHBvc3NpYmxlTWF0Y2ggJiAoMTw8aSkpIHsKKyAgICAgICAgICAgICAgICpjb25maWdzKysgPSAoRUdMQ29uZmlnKWk7CisgICAgICAgICAgICAgICAgY29uZmlnX3NpemUtLTsKKyAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgKm51bV9jb25maWcgPSBuOworICAgICByZXR1cm4gRUdMX1RSVUU7Cit9CisKK0VHTEJvb2xlYW4gZWdsR2V0Q29uZmlnQXR0cmliKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKQoreworICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKworICAgIHJldHVybiBnZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIGF0dHJpYnV0ZSwgdmFsdWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzdXJmYWNlcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFR0xTdXJmYWNlIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoICBFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICByZXR1cm4gY3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywgd2luZG93LCBhdHRyaWJfbGlzdCk7Cit9CisgICAgCitFR0xTdXJmYWNlIGVnbENyZWF0ZVBpeG1hcFN1cmZhY2UoICBFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZVBpeG1hcFR5cGUgcGl4bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICByZXR1cm4gY3JlYXRlUGl4bWFwU3VyZmFjZShkcHksIGNvbmZpZywgcGl4bWFwLCBhdHRyaWJfbGlzdCk7Cit9CisKK0VHTFN1cmZhY2UgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoIEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICByZXR1cm4gY3JlYXRlUGJ1ZmZlclN1cmZhY2UoZHB5LCBjb25maWcsIGF0dHJpYl9saXN0KTsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorRUdMQm9vbGVhbiBlZ2xEZXN0cm95U3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBlZ2xTdXJmYWNlKQoreworICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKyAgICBpZiAoZWdsU3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSkgeworICAgICAgICBlZ2xfc3VyZmFjZV90KiBzdXJmYWNlKCBzdGF0aWNfY2FzdDxlZ2xfc3VyZmFjZV90Kj4oZWdsU3VyZmFjZSkgKTsKKyAgICAgICAgaWYgKHN1cmZhY2UtPm1hZ2ljICE9IGVnbF9zdXJmYWNlX3Q6Ok1BR0lDKQorICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKKyAgICAgICAgaWYgKHN1cmZhY2UtPmRweSAhPSBkcHkpCisgICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgICAgICBkZWxldGUgc3VyZmFjZTsKKyAgICB9CisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCitFR0xCb29sZWFuIGVnbFF1ZXJ5U3VyZmFjZSggRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2UgZWdsU3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKQoreworICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKyAgICBlZ2xfc3VyZmFjZV90KiBzdXJmYWNlID0gc3RhdGljX2Nhc3Q8ZWdsX3N1cmZhY2VfdCo+KGVnbFN1cmZhY2UpOworICAgIGlmIChzdXJmYWNlLT5kcHkgIT0gZHB5KQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworCisgICAgRUdMQm9vbGVhbiByZXQgPSBFR0xfVFJVRTsKKyAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkgeworICAgICAgICBjYXNlIEVHTF9DT05GSUdfSUQ6CisgICAgICAgICAgICByZXQgPSBnZXRDb25maWdBdHRyaWIoZHB5LCBzdXJmYWNlLT5jb25maWcsIEVHTF9DT05GSUdfSUQsIHZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVHTF9XSURUSDoKKyAgICAgICAgICAgICp2YWx1ZSA9IHN1cmZhY2UtPmdldFdpZHRoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFR0xfSEVJR0hUOgorICAgICAgICAgICAgKnZhbHVlID0gc3VyZmFjZS0+Z2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFR0xfTEFSR0VTVF9QQlVGRkVSOgorICAgICAgICAgICAgLy8gbm90IG1vZGlmaWVkIGZvciBhIHdpbmRvdyBvciBwaXhtYXAgc3VyZmFjZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUdMX1RFWFRVUkVfRk9STUFUOgorICAgICAgICAgICAgKnZhbHVlID0gRUdMX05PX1RFWFRVUkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFR0xfVEVYVFVSRV9UQVJHRVQ6CisgICAgICAgICAgICAqdmFsdWUgPSBFR0xfTk9fVEVYVFVSRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVHTF9NSVBNQVBfVEVYVFVSRToKKyAgICAgICAgICAgICp2YWx1ZSA9IEVHTF9GQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVHTF9NSVBNQVBfTEVWRUw6CisgICAgICAgICAgICAqdmFsdWUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUdMX1JFTkRFUl9CVUZGRVI6CisgICAgICAgICAgICAvLyBUT0RPOiByZXR1cm4gdGhlIHJlYWwgUkVOREVSX0JVRkZFUiBoZXJlCisgICAgICAgICAgICAqdmFsdWUgPSBFR0xfQkFDS19CVUZGRVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFR0xfSE9SSVpPTlRBTF9SRVNPTFVUSU9OOgorICAgICAgICAgICAgLy8gcGl4ZWwvbW0gKiBFR0xfRElTUExBWV9TQ0FMSU5HCisgICAgICAgICAgICAqdmFsdWUgPSBzdXJmYWNlLT5nZXRIb3Jpem9udGFsUmVzb2x1dGlvbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUdMX1ZFUlRJQ0FMX1JFU09MVVRJT046CisgICAgICAgICAgICAvLyBwaXhlbC9tbSAqIEVHTF9ESVNQTEFZX1NDQUxJTkcKKyAgICAgICAgICAgICp2YWx1ZSA9IHN1cmZhY2UtPmdldFZlcnRpY2FsUmVzb2x1dGlvbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUdMX1BJWEVMX0FTUEVDVF9SQVRJTzogeworICAgICAgICAgICAgLy8gdy9oICogRUdMX0RJU1BMQVlfU0NBTElORworICAgICAgICAgICAgaW50IHdyID0gc3VyZmFjZS0+Z2V0SG9yaXpvbnRhbFJlc29sdXRpb24oKTsKKyAgICAgICAgICAgIGludCBociA9IHN1cmZhY2UtPmdldFZlcnRpY2FsUmVzb2x1dGlvbigpOworICAgICAgICAgICAgKnZhbHVlID0gKHdyICogRUdMX0RJU1BMQVlfU0NBTElORykgLyBocjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFR0xfU1dBUF9CRUhBVklPUjoKKyAgICAgICAgICAgICp2YWx1ZSA9IHN1cmZhY2UtPmdldFN3YXBCZWhhdmlvcigpOyAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0ID0gc2V0RXJyb3IoRUdMX0JBRF9BVFRSSUJVVEUsIEVHTF9GQUxTRSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK0VHTENvbnRleHQgZWdsQ3JlYXRlQ29udGV4dChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb250ZXh0IHNoYXJlX2xpc3QsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCit7CisgICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfTk9fU1VSRkFDRSk7CisKKyAgICBvZ2xlc19jb250ZXh0X3QqIGdsID0gb2dsZXNfaW5pdChzaXplb2YoZWdsX2NvbnRleHRfdCkpOworICAgIGlmICghZ2wpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfTk9fQ09OVEVYVCk7CisKKyAgICBlZ2xfY29udGV4dF90KiBjID0gc3RhdGljX2Nhc3Q8ZWdsX2NvbnRleHRfdCo+KGdsLT5yYXN0ZXJpemVyLmJhc2UpOworICAgIGMtPmZsYWdzID0gZWdsX2NvbnRleHRfdDo6TkVWRVJfQ1VSUkVOVDsKKyAgICBjLT5kcHkgPSBkcHk7CisgICAgYy0+Y29uZmlnID0gY29uZmlnOworICAgIGMtPnJlYWQgPSAwOworICAgIGMtPmRyYXcgPSAwOworICAgIHJldHVybiAoRUdMQ29udGV4dClnbDsKK30KKworRUdMQm9vbGVhbiBlZ2xEZXN0cm95Q29udGV4dChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgpCit7CisgICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIGVnbF9jb250ZXh0X3QqIGMgPSBlZ2xfY29udGV4dF90Ojpjb250ZXh0KGN0eCk7CisgICAgaWYgKGMtPmZsYWdzICYgZWdsX2NvbnRleHRfdDo6SVNfQ1VSUkVOVCkKKyAgICAgICAgc2V0R2xUaHJlYWRTcGVjaWZpYygwKTsKKyAgICBvZ2xlc191bmluaXQoKG9nbGVzX2NvbnRleHRfdCopY3R4KTsKKyAgICByZXR1cm4gRUdMX1RSVUU7Cit9CisKK0VHTEJvb2xlYW4gZWdsTWFrZUN1cnJlbnQoICBFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTFN1cmZhY2UgcmVhZCwgRUdMQ29udGV4dCBjdHgpCit7CisgICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIGlmIChkcmF3KSB7CisgICAgICAgIGVnbF9zdXJmYWNlX3QqIHMgPSAoZWdsX3N1cmZhY2VfdCopZHJhdzsKKyAgICAgICAgaWYgKHMtPmRweSAhPSBkcHkpCisgICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGF0IGRyYXcgYW5kIHJlYWQgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgY29udGV4dAorICAgIH0KKworICAgIEVHTENvbnRleHQgY3VycmVudF9jdHggPSBFR0xfTk9fQ09OVEVYVDsKKyAgICAKKyAgICBpZiAoKHJlYWQgPT0gRUdMX05PX1NVUkZBQ0UgJiYgZHJhdyA9PSBFR0xfTk9fU1VSRkFDRSkgJiYgKGN0eCAhPSBFR0xfTk9fQ09OVEVYVCkpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfRkFMU0UpOworCisgICAgaWYgKChyZWFkICE9IEVHTF9OT19TVVJGQUNFIHx8IGRyYXcgIT0gRUdMX05PX1NVUkZBQ0UpICYmIChjdHggPT0gRUdMX05PX0NPTlRFWFQpKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX0ZBTFNFKTsKKworICAgIGlmIChjdHggPT0gRUdMX05PX0NPTlRFWFQpIHsKKyAgICAgICAgLy8gaWYgd2UncmUgZGV0YWNoaW5nLCB3ZSBuZWVkIHRoZSBjdXJyZW50IGNvbnRleHQKKyAgICAgICAgY3VycmVudF9jdHggPSAoRUdMQ29udGV4dClnZXRHbFRocmVhZFNwZWNpZmljKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZWdsX2NvbnRleHRfdCogYyA9IGVnbF9jb250ZXh0X3Q6OmNvbnRleHQoY3R4KTsKKyAgICAgICAgZWdsX3N1cmZhY2VfdCogZCA9IChlZ2xfc3VyZmFjZV90KilkcmF3OworICAgICAgICBlZ2xfc3VyZmFjZV90KiByID0gKGVnbF9zdXJmYWNlX3QqKXJlYWQ7CisgICAgICAgIGlmICgoZCAmJiBkLT5jdHggJiYgZC0+Y3R4ICE9IGN0eCkgfHwKKyAgICAgICAgICAgIChyICYmIHItPmN0eCAmJiByLT5jdHggIT0gY3R4KSkgeworICAgICAgICAgICAgLy8gb25jZSBvZiB0aGUgc3VyZmFjZSBpcyBib3VuZCB0byBhIGNvbnRleHQgaW4gYW5vdGhlciB0aHJlYWQKKyAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FDQ0VTUywgRUdMX0ZBTFNFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9nbGVzX2NvbnRleHRfdCogZ2wgPSAob2dsZXNfY29udGV4dF90KiljdHg7CisgICAgaWYgKG1ha2VDdXJyZW50KGdsKSA9PSAwKSB7CisgICAgICAgIGlmIChjdHgpIHsKKyAgICAgICAgICAgIGVnbF9jb250ZXh0X3QqIGMgPSBlZ2xfY29udGV4dF90Ojpjb250ZXh0KGN0eCk7CisgICAgICAgICAgICBlZ2xfc3VyZmFjZV90KiBkID0gKGVnbF9zdXJmYWNlX3QqKWRyYXc7CisgICAgICAgICAgICBlZ2xfc3VyZmFjZV90KiByID0gKGVnbF9zdXJmYWNlX3QqKXJlYWQ7CisgICAgICAgICAgICBjLT5yZWFkID0gcmVhZDsKKyAgICAgICAgICAgIGMtPmRyYXcgPSBkcmF3OworICAgICAgICAgICAgaWYgKGMtPmZsYWdzICYgZWdsX2NvbnRleHRfdDo6TkVWRVJfQ1VSUkVOVCkgeworICAgICAgICAgICAgICAgIGMtPmZsYWdzICY9IH5lZ2xfY29udGV4dF90OjpORVZFUl9DVVJSRU5UOworICAgICAgICAgICAgICAgIEdMaW50IHcgPSAwOworICAgICAgICAgICAgICAgIEdMaW50IGggPSAwOworICAgICAgICAgICAgICAgIGlmIChkcmF3KSB7CisgICAgICAgICAgICAgICAgICAgIHcgPSBkLT5nZXRXaWR0aCgpOworICAgICAgICAgICAgICAgICAgICBoID0gZC0+Z2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9nbGVzX3N1cmZhY2Vwb3J0KGdsLCAwLCAwKTsKKyAgICAgICAgICAgICAgICBvZ2xlc192aWV3cG9ydChnbCwgMCwgMCwgdywgaCk7CisgICAgICAgICAgICAgICAgb2dsZXNfc2Npc3NvcihnbCwgMCwgMCwgdywgaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZCkgeworICAgICAgICAgICAgICAgIGQtPmN0eCA9IGN0eDsKKyAgICAgICAgICAgICAgICBkLT5iaW5kRHJhd1N1cmZhY2UoZ2wpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHIpIHsKKyAgICAgICAgICAgICAgICByLT5jdHggPSBjdHg7CisgICAgICAgICAgICAgICAgci0+YmluZFJlYWRTdXJmYWNlKGdsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIHN1cmZhY2VzIHdlcmUgYm91bmQgdG8gdGhlIGNvbnRleHQgYm91bmQgdG8gdGhpcyB0aHJlYWQKKyAgICAgICAgICAgIC8vIG1hcmsgdGhlbiBhcyB1bmJvdW5kLgorICAgICAgICAgICAgaWYgKGN1cnJlbnRfY3R4KSB7CisgICAgICAgICAgICAgICAgZWdsX2NvbnRleHRfdCogYyA9IGVnbF9jb250ZXh0X3Q6OmNvbnRleHQoY3VycmVudF9jdHgpOworICAgICAgICAgICAgICAgIGVnbF9zdXJmYWNlX3QqIGQgPSAoZWdsX3N1cmZhY2VfdCopYy0+ZHJhdzsKKyAgICAgICAgICAgICAgICBlZ2xfc3VyZmFjZV90KiByID0gKGVnbF9zdXJmYWNlX3QqKWMtPnJlYWQ7CisgICAgICAgICAgICAgICAgaWYgKGQpIGQtPmN0eCA9IEVHTF9OT19DT05URVhUOworICAgICAgICAgICAgICAgIGlmIChyKSByLT5jdHggPSBFR0xfTk9fQ09OVEVYVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRUdMX1RSVUU7CisgICAgfQorICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FDQ0VTUywgRUdMX0ZBTFNFKTsKK30KKworRUdMQ29udGV4dCBlZ2xHZXRDdXJyZW50Q29udGV4dCh2b2lkKQoreworICAgIC8vIGVnbEdldEN1cnJlbnRDb250ZXh0IHJldHVybnMgdGhlIGN1cnJlbnQgRUdMIHJlbmRlcmluZyBjb250ZXh0LAorICAgIC8vIGFzIHNwZWNpZmllZCBieSBlZ2xNYWtlQ3VycmVudC4gSWYgbm8gY29udGV4dCBpcyBjdXJyZW50LAorICAgIC8vIEVHTF9OT19DT05URVhUIGlzIHJldHVybmVkLgorICAgIHJldHVybiAoRUdMQ29udGV4dClnZXRHbFRocmVhZFNwZWNpZmljKCk7Cit9CisKK0VHTFN1cmZhY2UgZWdsR2V0Q3VycmVudFN1cmZhY2UoRUdMaW50IHJlYWRkcmF3KQoreworICAgIC8vIGVnbEdldEN1cnJlbnRTdXJmYWNlIHJldHVybnMgdGhlIHJlYWQgb3IgZHJhdyBzdXJmYWNlIGF0dGFjaGVkCisgICAgLy8gdG8gdGhlIGN1cnJlbnQgRUdMIHJlbmRlcmluZyBjb250ZXh0LCBhcyBzcGVjaWZpZWQgYnkgZWdsTWFrZUN1cnJlbnQuCisgICAgLy8gSWYgbm8gY29udGV4dCBpcyBjdXJyZW50LCBFR0xfTk9fU1VSRkFDRSBpcyByZXR1cm5lZC4KKyAgICBFR0xDb250ZXh0IGN0eCA9IChFR0xDb250ZXh0KWdldEdsVGhyZWFkU3BlY2lmaWMoKTsKKyAgICBpZiAoY3R4ID09IEVHTF9OT19DT05URVhUKSByZXR1cm4gRUdMX05PX1NVUkZBQ0U7CisgICAgZWdsX2NvbnRleHRfdCogYyA9IGVnbF9jb250ZXh0X3Q6OmNvbnRleHQoY3R4KTsKKyAgICBpZiAocmVhZGRyYXcgPT0gRUdMX1JFQUQpIHsKKyAgICAgICAgcmV0dXJuIGMtPnJlYWQ7CisgICAgfSBlbHNlIGlmIChyZWFkZHJhdyA9PSBFR0xfRFJBVykgeworICAgICAgICByZXR1cm4gYy0+ZHJhdzsKKyAgICB9CisgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQVRUUklCVVRFLCBFR0xfTk9fU1VSRkFDRSk7Cit9CisKK0VHTERpc3BsYXkgZWdsR2V0Q3VycmVudERpc3BsYXkodm9pZCkKK3sKKyAgICAvLyBlZ2xHZXRDdXJyZW50RGlzcGxheSByZXR1cm5zIHRoZSBjdXJyZW50IEVHTCBkaXNwbGF5IGNvbm5lY3Rpb24KKyAgICAvLyBmb3IgdGhlIGN1cnJlbnQgRUdMIHJlbmRlcmluZyBjb250ZXh0LCBhcyBzcGVjaWZpZWQgYnkgZWdsTWFrZUN1cnJlbnQuCisgICAgLy8gSWYgbm8gY29udGV4dCBpcyBjdXJyZW50LCBFR0xfTk9fRElTUExBWSBpcyByZXR1cm5lZC4KKyAgICBFR0xDb250ZXh0IGN0eCA9IChFR0xDb250ZXh0KWdldEdsVGhyZWFkU3BlY2lmaWMoKTsKKyAgICBpZiAoY3R4ID09IEVHTF9OT19DT05URVhUKSByZXR1cm4gRUdMX05PX0RJU1BMQVk7CisgICAgZWdsX2NvbnRleHRfdCogYyA9IGVnbF9jb250ZXh0X3Q6OmNvbnRleHQoY3R4KTsKKyAgICByZXR1cm4gYy0+ZHB5OworfQorCitFR0xCb29sZWFuIGVnbFF1ZXJ5Q29udGV4dCggRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpCit7CisgICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIGVnbF9jb250ZXh0X3QqIGMgPSBlZ2xfY29udGV4dF90Ojpjb250ZXh0KGN0eCk7CisgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHsKKyAgICAgICAgY2FzZSBFR0xfQ09ORklHX0lEOgorICAgICAgICAgICAgLy8gUmV0dXJucyB0aGUgSUQgb2YgdGhlIEVHTCBmcmFtZSBidWZmZXIgY29uZmlndXJhdGlvbiB3aXRoCisgICAgICAgICAgICAvLyByZXNwZWN0IHRvIHdoaWNoIHRoZSBjb250ZXh0IHdhcyBjcmVhdGVkCisgICAgICAgICAgICByZXR1cm4gZ2V0Q29uZmlnQXR0cmliKGRweSwgYy0+Y29uZmlnLCBFR0xfQ09ORklHX0lELCB2YWx1ZSk7CisgICAgfQorICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FUVFJJQlVURSwgRUdMX0ZBTFNFKTsKK30KKworRUdMQm9vbGVhbiBlZ2xXYWl0R0wodm9pZCkKK3sKKyAgICByZXR1cm4gRUdMX1RSVUU7Cit9CisKK0VHTEJvb2xlYW4gZWdsV2FpdE5hdGl2ZShFR0xpbnQgZW5naW5lKQoreworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworRUdMQm9vbGVhbiBlZ2xTd2FwQnVmZmVycyhFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3KQoreworICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKyAgICAKKyAgICBlZ2xfc3VyZmFjZV90KiBkID0gc3RhdGljX2Nhc3Q8ZWdsX3N1cmZhY2VfdCo+KGRyYXcpOworICAgIGlmIChkLT5kcHkgIT0gZHB5KQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworCisgICAgLy8gcG9zdCB0aGUgc3VyZmFjZQorICAgIGQtPnN3YXBCdWZmZXJzKCk7CisKKyAgICAvLyBpZiBpdCdzIGJvdW5kIHRvIGEgY29udGV4dCwgdXBkYXRlIHRoZSBidWZmZXIKKyAgICBpZiAoZC0+Y3R4ICE9IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIGQtPmJpbmREcmF3U3VyZmFjZSgob2dsZXNfY29udGV4dF90KilkLT5jdHgpOworICAgICAgICAvLyBpZiB0aGlzIHN1cmZhY2UgaXMgYWxzbyB0aGUgcmVhZCBzdXJmYWNlIG9mIHRoZSBjb250ZXh0CisgICAgICAgIC8vIGl0IGlzIGJvdW5kIHRvLCBtYWtlIHN1cmUgdG8gdXBkYXRlIHRoZSByZWFkIGJ1ZmZlciBhcyB3ZWxsLgorICAgICAgICAvLyBUaGUgRUdMIHNwZWMgaXMgYSBsaXR0bGUgdW5jbGVhciBhYm91dCB0aGlzLgorICAgICAgICBlZ2xfY29udGV4dF90KiBjID0gZWdsX2NvbnRleHRfdDo6Y29udGV4dChkLT5jdHgpOworICAgICAgICBpZiAoYy0+cmVhZCA9PSBkcmF3KSB7CisgICAgICAgICAgICBkLT5iaW5kUmVhZFN1cmZhY2UoKG9nbGVzX2NvbnRleHRfdCopZC0+Y3R4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworRUdMQm9vbGVhbiBlZ2xDb3B5QnVmZmVycyggIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlUGl4bWFwVHlwZSB0YXJnZXQpCit7CisgICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIC8vIFRPRE86IGVnbENvcHlCdWZmZXJzKCkKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorCitFR0xpbnQgZWdsR2V0RXJyb3Iodm9pZCkKK3sKKyAgICByZXR1cm4gZ2V0RXJyb3IoKTsKK30KKworY29uc3QgY2hhciogZWdsUXVlcnlTdHJpbmcoRUdMRGlzcGxheSBkcHksIEVHTGludCBuYW1lKQoreworICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgKGNvbnN0IGNoYXIqKTApOworCisgICAgc3dpdGNoIChuYW1lKSB7CisgICAgICAgIGNhc2UgRUdMX1ZFTkRPUjoKKyAgICAgICAgICAgIHJldHVybiBnVmVuZG9yU3RyaW5nOworICAgICAgICBjYXNlIEVHTF9WRVJTSU9OOgorICAgICAgICAgICAgcmV0dXJuIGdWZXJzaW9uU3RyaW5nOworICAgICAgICBjYXNlIEVHTF9FWFRFTlNJT05TOgorICAgICAgICAgICAgcmV0dXJuIGdFeHRlbnNpb25zU3RyaW5nOworICAgICAgICBjYXNlIEVHTF9DTElFTlRfQVBJUzoKKyAgICAgICAgICAgIHJldHVybiBnQ2xpZW50QXBpU3RyaW5nOworICAgIH0KKyAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIChjb25zdCBjaGFyICopMCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVHTCAxLjEKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRUdMQm9vbGVhbiBlZ2xTdXJmYWNlQXR0cmliKAorICAgICAgICBFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgdmFsdWUpCit7CisgICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIC8vIFRPRE86IGVnbFN1cmZhY2VBdHRyaWIoKQorICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX0ZBTFNFKTsKK30KKworRUdMQm9vbGVhbiBlZ2xCaW5kVGV4SW1hZ2UoCisgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBidWZmZXIpCit7CisgICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIC8vIFRPRE86IGVnbEJpbmRUZXhJbWFnZSgpCisgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOworfQorCitFR0xCb29sZWFuIGVnbFJlbGVhc2VUZXhJbWFnZSgKKyAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGJ1ZmZlcikKK3sKKyAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisgICAgLy8gVE9ETzogZWdsUmVsZWFzZVRleEltYWdlKCkKKyAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7Cit9CisKK0VHTEJvb2xlYW4gZWdsU3dhcEludGVydmFsKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgaW50ZXJ2YWwpCit7CisgICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIC8vIFRPRE86IGVnbFN3YXBJbnRlcnZhbCgpCisgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFR0wgMS4yCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VHTEJvb2xlYW4gZWdsQmluZEFQSShFR0xlbnVtIGFwaSkKK3sKKyAgICBpZiAoYXBpICE9IEVHTF9PUEVOR0xfRVNfQVBJKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7CisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCitFR0xlbnVtIGVnbFF1ZXJ5QVBJKHZvaWQpCit7CisgICAgcmV0dXJuIEVHTF9PUEVOR0xfRVNfQVBJOworfQorCitFR0xCb29sZWFuIGVnbFdhaXRDbGllbnQodm9pZCkKK3sKKyAgICBnbEZpbmlzaCgpOworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworRUdMQm9vbGVhbiBlZ2xSZWxlYXNlVGhyZWFkKHZvaWQpCit7CisgICAgLy8gVE9ETzogZWdsUmVsZWFzZVRocmVhZCgpCisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCitFR0xTdXJmYWNlIGVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyKAorICAgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIGJ1ZnR5cGUsIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsCisgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9OT19TVVJGQUNFKTsKKyAgICAvLyBUT0RPOiBlZ2xDcmVhdGVQYnVmZmVyRnJvbUNsaWVudEJ1ZmZlcigpCisgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfTk9fU1VSRkFDRSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFuZHJvaWQgZXh0ZW5zaW9ucworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkICgqZWdsR2V0UHJvY0FkZHJlc3MgKGNvbnN0IGNoYXIgKnByb2NuYW1lKSkoKQoreworICAgIGV4dGVudGlvbl9tYXBfdCBjb25zdCAqIGNvbnN0IG1hcCA9IGdFeHRlbnRpb25NYXA7CisgICAgZm9yICh1aW50MzJfdCBpPTAgOyBpPE5FTEVNKGdFeHRlbnRpb25NYXApIDsgaSsrKSB7CisgICAgICAgIGlmICghc3RyY21wKHByb2NuYW1lLCBtYXBbaV0ubmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXBbaV0uYWRkcmVzczsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvZml4ZWRfYXNtLlMgYi9vcGVuZ2wvbGliYWdsL2ZpeGVkX2FzbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYmM1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL2ZpeGVkX2FzbS5TCkBAIC0wLDAgKzEsNjUgQEAKKy8qIGxpYnMvb3BlbmdsZXMvZml4ZWRfYXNtLlMKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKKyAgICAudGV4dAorICAgIC5hbGlnbgorICAgIAorICAgIC5nbG9iYWwgZ2dsRmxvYXRUb0ZpeGVkCisgICAgLmdsb2JhbCBnZ2xGbG9hdFRvRml4ZWRGYXN0CisKKworLyoKKyAqIENvbnZlcnRzIGEgZmxvYXQgdG8gYSBzMTUuMTYgZml4ZWQtcG9pbnQgbnVtYmVyLgorICogdGhpcyBkb2Vzbid0IGhhbmRsZSBmbG9hdHMgb3V0IG9mIHRoZSBbLTMyNzY4LCArMzI3NjhbIHJhbmdlCisgKiBhbmQgZG9lc24ndCBwZXJmb3JtcyByb3VuZC10by1uZWFyZXN0LgorICogaG93ZXZlciwgaXQncyB2ZXJ5IGZhc3QgOi0pCisgKi8KKworZ2dsRmxvYXRUb0ZpeGVkRmFzdDoKKyAgICAgICAgbW92cyAgICByMSwgcjAsIGxzbCAjMSAgICAgICAgICAvKiByZW1vdmUgYml0IHNpZ24gKi8KKyAgICAgICAgbW92ICAgICByMiwgIzB4OEUgICAgICAgICAgICAgICAvKiAxMjcgKyAxNSAqLworICAgICAgICBzdWIgICAgIHIxLCByMiwgcjEsIGxzciAjMjQgICAgIC8qIGNvbXB1dGUgc2hpZnQgKi8KKyAgICAgICAgbW92ICAgICByMiwgcjAsIGxzbCAjOCAgICAgICAgICAvKiBtYW50aXNzYTw8OCAqLworICAgICAgICBvcnIgICAgIHIyLCByMiwgIzB4ODAwMDAwMDAgICAgIC8qIGFkZCB0aGUgbWlzc2luZyAxICovCisgICAgICAgIG1vdiAgICAgcjAsIHIyLCBsc3IgcjEgICAgICAgICAgLyogc2NhbGUgdG8gMTYuMTYgKi8KKyAgICAgICAgcnNiY3MgICByMCwgcjAsICMwICAgICAgICAgICAgICAvKiBuZWdhdGUgaWYgbmVlZGVkICovCisgICAgICAgIGJ4ICAgICAgbHIKKworLyoKKyAqIHRoaXMgdmVyc2lvbiByb3VuZHMtdG8tbmVhcmVzdCBhbmQgc2F0dXJhdGVzIG51bWJlcnMKKyAqIG91dHNpZGUgdGhlIHJhbmdlIChidXQgbm90IE5hTnMpLgorICovCisKK2dnbEZsb2F0VG9GaXhlZDoKKyAgICAgICAgbW92ICAgICByMSwgcjAsIGxzbCAjMSAgICAgICAgICAvKiByZW1vdmUgYml0IHNpZ24gKi8KKyAgICAgICAgbW92ICAgICByMiwgIzB4OEUgICAgICAgICAgICAgICAvKiAxMjcgKyAxNSAqLworICAgICAgICBzdWJzICAgIHIxLCByMiwgcjEsIGxzciAjMjQgICAgIC8qIGNvbXB1dGUgc2hpZnQgKi8KKyAgICAgICAgYmxzICAgICAwZiAgICAgICAgICAgICAgICAgICAgICAvKiB0b28gYmlnICovCisgICAgICAgIG1vdiAgICAgcjIsIHIwLCBsc2wgIzggICAgICAgICAgLyogbWFudGlzc2E8PDggKi8KKyAgICAgICAgb3JyICAgICByMiwgcjIsICMweDgwMDAwMDAwICAgICAvKiBhZGQgdGhlIG1pc3NpbmcgMSAqLworICAgICAgICBtb3YgICAgIHIzLCByMAorICAgICAgICBtb3ZzICAgIHIwLCByMiwgbHNyIHIxICAgICAgICAgIC8qIHNjYWxlIHRvIDE2LjE2ICovCisgICAgICAgIGFkZGNzICAgcjAsIHIwLCAjMSAgICAgICAgICAgICAgLyogcm91bmQtdG8tbmVhcmVzdCAqLworICAgICAgICB0c3QgICAgIHIzLCAjMHg4MDAwMDAwMCAgICAgICAgIC8qIG5lZ2F0aXZlPyAqLworICAgICAgICByc2JuZSAgIHIwLCByMCwgIzAgICAgICAgICAgICAgIC8qIG5lZ2F0ZSBpZiBuZWVkZWQgKi8KKyAgICAgICAgYnggICAgICBsciAKKyAKKzA6ICAgICAgYW5kcyAgICByMCwgcjAsICMweDgwMDAwMDAwICAgICAvKiBrZWVwIG9ubHkgdGhlIHNpZ24gYml0ICovCisgICAgICAgIG1vdmVxICAgcjAsICMweDdmZmZmZmZmICAgICAgICAgLyogcG9zaXRpdmUsIG1heGltdW0gdmFsdWUgKi8KKyAgICAgICAgYnggICAgICBscgorCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2ZwLmNwcCBiL29wZW5nbC9saWJhZ2wvZnAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNWYxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL2ZwLmNwcApAQCAtMCwwICsxLDg3IEBACisvKiBsaWJzL29wZW5nbGVzL2ZwLmNwcAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlICJmcC5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAhZGVmaW5lZChfX2FybV9fKQorR0dMZml4ZWQgZ2dsRmxvYXRUb0ZpeGVkKGZsb2F0IHYpIHsgICAKKyAgICByZXR1cm4gR0dMZml4ZWQoZmxvb3JmKHYgKiA2NTUzNi4wZiArIDAuNWYpKTsKK30KKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGdsIHsKKworR0xmbG9hdCBmaXhlZFRvRmxvYXQoR0xmaXhlZCB4KQoreworI2lmIERFQlVHX1VTRV9GTE9BVFMKKyAgICByZXR1cm4geCAvIDY1NTM2LjBmOworI2Vsc2UKKyAgICBpZiAoIXgpIHJldHVybiAwOworICAgIGNvbnN0IHVpbnQzMl90IHMgPSB4ICYgMHg4MDAwMDAwMDsKKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IGk7CisgICAgICAgIGZsb2F0IGY7CisgICAgfTsKKyAgICBpID0gcyA/IC14IDogeDsKKyAgICBjb25zdCBpbnQgYyA9IGdnbENseihpKSAtIDg7CisgICAgaSA9IChjPj0wKSA/IChpPDxjKSA6IChpPj4tYyk7CisgICAgY29uc3QgdWludDMyX3QgZSA9IDEzNCAtIGM7CisgICAgaSAmPSB+MHg4MDAwMDA7CisgICAgaSB8PSBlPDwyMzsKKyAgICBpIHw9IHM7CisgICAgcmV0dXJuIGY7CisjZW5kaWYKK30KKworZmxvYXQgc2luZWYoZmxvYXQgeCkKK3sKKyAgICBjb25zdCBmbG9hdCBBID0gICAxLjBmIC8gKDIuMGYqTV9QSSk7CisgICAgY29uc3QgZmxvYXQgQiA9IC0xNi4wZjsKKyAgICBjb25zdCBmbG9hdCBDID0gICA4LjBmOworCisgICAgLy8gc2NhbGUgYW5nbGUgZm9yIGVhc3kgYXJndW1lbnQgcmVkdWN0aW9uCisgICAgeCAqPSBBOworICAgIAorICAgIGlmIChmYWJzZih4KSA+PSAwLjVmKSB7CisgICAgICAgIC8vIEFyZ3VtZW50IHJlZHVjdGlvbgorICAgICAgICB4ID0geCAtIGNlaWxmKHggKyAwLjVmKSArIDEuMGY7IAorICAgIH0KKworICAgIGNvbnN0IGZsb2F0IHkgPSBCKngqZmFic2YoeCkgKyBDKng7CisgICAgcmV0dXJuIDAuMjIxNWYgKiAoeSpmYWJzZih5KSAtIHkpICsgeTsKK30KKworZmxvYXQgY29zaW5lZihmbG9hdCB4KQoreworICAgIHJldHVybiBzaW5lZih4ICsgZmxvYXQoTV9QSS8yKSk7Cit9CisKK3ZvaWQgc2luY29zZihHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0KiBzLCBHTGZsb2F0KiBjKSB7CisgICAgKnMgPSBzaW5lZihhbmdsZSk7CisgICAgKmMgPSBjb3NpbmVmKGFuZ2xlKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGZwX3V0aWxzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2ZwLmggYi9vcGVuZ2wvbGliYWdsL2ZwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQwYzE4MwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJhZ2wvZnAuaApAQCAtMCwwICsxLDI0MyBAQAorLyogbGlicy9vcGVuZ2xlcy9mcC5oCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX0ZQX0gKKyNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19GUF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlIDxwcml2YXRlL3BpeGVsZmxpbmdlci9nZ2xfY29udGV4dC5oPgorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCisjZGVmaW5lIERFQlVHX1VTRV9GTE9BVFMgICAgICAwCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXh0ZXJuICJDIiBHTGZpeGVkIGdnbEZsb2F0VG9GaXhlZChmbG9hdCBmKSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBnbCB7CisKKyAgICAgICAgR0xmbG9hdCBmaXhlZFRvRmxvYXQoR0xmaXhlZCkgQ09OU1Q7CisKKyAgICAgICAgdm9pZCAgICBzaW5jb3NmKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQqIHMsIEdMZmxvYXQqIGMpOworICAgICAgICBmbG9hdCAgIHNpbmVmKEdMZmxvYXQgeCkgQ09OU1Q7CisgICAgICAgIGZsb2F0ICAgY29zaW5lZihHTGZsb2F0IHgpIENPTlNUOworCitpbmxpbmUgYm9vbCAgICAgY21wZihHTGZsb2F0IGEsIEdMZmxvYXQgYikgQ09OU1Q7CitpbmxpbmUgYm9vbCAgICAgaXNaZXJvZihHTGZsb2F0KSBDT05TVDsKK2lubGluZSBib29sICAgICBpc09uZWYoR0xmbG9hdCkgQ09OU1Q7CisKK2lubGluZSBpbnQgICAgICBpc1plcm9Pck5lZ2F0aXZlZihHTGZsb2F0KSBDT05TVDsKKworaW5saW5lIGludCAgICAgIGV4cG9uZW50KEdMZmxvYXQpIENPTlNUOworaW5saW5lIGludDMyX3QgIG1hbnRpc3NhKEdMZmxvYXQpIENPTlNUOworaW5saW5lIEdMZmxvYXQgIGNsYW1wVG9aZXJvZihHTGZsb2F0KSBDT05TVDsKK2lubGluZSBHTGZsb2F0ICByZWNpcHJvY2FsZihHTGZsb2F0KSBDT05TVDsKK2lubGluZSBHTGZsb2F0ICByc3FydGYoR0xmbG9hdCkgQ09OU1Q7CitpbmxpbmUgR0xmbG9hdCAgc3FyZihHTGZsb2F0KSBDT05TVDsKK2lubGluZSBHTGZsb2F0ICBhZGRFeHBmKEdMZmxvYXQgdiwgaW50IGUpIENPTlNUOworaW5saW5lIEdMZmxvYXQgIG11bDJmKEdMZmxvYXQgdikgQ09OU1Q7CitpbmxpbmUgR0xmbG9hdCAgZGl2MmYoR0xmbG9hdCB2KSBDT05TVDsKK2lubGluZSBHTGZsb2F0ICBhYnNmKEdMZmxvYXQgdikgQ09OU1Q7CisKKworLyogCisgKiBmbG9hdCBmYXN0ZXhwZihmbG9hdCkgOiBhIGZhc3QgYXBwcm94aW1hdGlvbiBvZiBleHBmKHgpCisgKgkJZ2l2ZSBzb21ld2hhdCBhY2N1cmF0ZSByZXN1bHRzIGZvciAtODggPD0geCA8PSA4OAorICoKKyAqIGV4cCh4KSA9IDJeKHgvbG4oMikpCisgKiB3ZSB1c2UgdGhlIHByb3BlcnRpZXMgb2YgZmxvYXQgZW5jb2RpbmcKKyAqIHRvIGdldCBhIGZhc3QgMl4gYW5kIGxpbmVhciBpbnRlcnBvbGF0aW9uCisgKgorICovCisKK2lubGluZSBmbG9hdCBmYXN0ZXhwZihmbG9hdCB5KSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOworCitpbmxpbmUgZmxvYXQgZmFzdGV4cGYoZmxvYXQgeSkKK3sKKwl1bmlvbiB7CisJCWZsb2F0CXI7CisJCWludDMyX3QJaTsKKwl9IHU7CQorCisJLy8gMTI3KmxuKDIpID0gODgKKwlpZiAoeSA8IC04OC4wZikgeworCQl1LnIgPSAwLjBmOworCX0gZWxzZSBpZiAoeSA+IDg4LjBmKSB7CisJCXUuciA9IElORklOSVRZOworCX0gZWxzZSB7CisJCWNvbnN0IGZsb2F0IGtPbmVPdmVyTG9nVHdvID0gKDFMPDwyMykgLyBNX0xOMjsKKwkJY29uc3QgaW50MzJfdCBrRXhwb25lbnRCaWFzID0gMTI3TDw8MjM7CisJCWNvbnN0IGludDMyX3QgZSA9IGludDMyX3QoeSprT25lT3ZlckxvZ1R3byk7CisJCXUuaSA9IGUgKyBrRXhwb25lbnRCaWFzOworCX0KKwkKKwlyZXR1cm4gdS5yOworfQorCisKK2Jvb2wgY21wZihHTGZsb2F0IGEsIEdMZmxvYXQgYikgeworI2lmIERFQlVHX1VTRV9GTE9BVFMKKyAgICByZXR1cm4gYSA9PSBiOworI2Vsc2UKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0ICAgICAgIGY7CisgICAgICAgIHVpbnQzMl90ICAgIGk7CisgICAgfSB1YSwgdWI7CisgICAgdWEuZiA9IGE7CisgICAgdWIuZiA9IGI7CisgICAgcmV0dXJuIHVhLmkgPT0gdWIuaTsKKyNlbmRpZgorfSAKKworYm9vbCBpc1plcm9mKEdMZmxvYXQgdikgeworI2lmIERFQlVHX1VTRV9GTE9BVFMKKyAgICByZXR1cm4gdiA9PSAwOworI2Vsc2UKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0ICAgICAgIGY7CisgICAgICAgIGludDMyX3QgICAgIGk7CisgICAgfTsKKyAgICBmID0gdjsKKyAgICByZXR1cm4gKGk8PDEpID09IDA7CisjZW5kaWYKK30KKworYm9vbCBpc09uZWYoR0xmbG9hdCB2KSB7CisgICAgcmV0dXJuIGNtcGYodiwgMS4wZik7Cit9CisKK2ludCBpc1plcm9Pck5lZ2F0aXZlZihHTGZsb2F0IHYpIHsKKyNpZiBERUJVR19VU0VfRkxPQVRTCisgICAgcmV0dXJuIHYgPD0gMDsKKyNlbHNlCisgICAgdW5pb24geworICAgICAgICBmbG9hdCAgICAgICBmOworICAgICAgICBpbnQzMl90ICAgICBpOworICAgIH07CisgICAgZiA9IHY7CisgICAgcmV0dXJuIGlzWmVyb2YodikgfCAoaT4+MzEpOworI2VuZGlmCit9CisKK2ludCBleHBvbmVudChHTGZsb2F0IHYpIHsKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0ICAgIGY7CisgICAgICAgIHVpbnQzMl90IGk7CisgICAgfTsKKyAgICBmID0gdjsKKyAgICByZXR1cm4gKChpIDw8IDEpID4+IDI0KSAtIDEyNzsKK30KKworaW50MzJfdCBtYW50aXNzYShHTGZsb2F0IHYpIHsKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0ICAgIGY7CisgICAgICAgIHVpbnQzMl90IGk7CisgICAgfTsKKyAgICBmID0gdjsKKyAgICBpZiAoIShpJjB4N0Y4MDAwMDApKSByZXR1cm4gMDsKKyAgICBjb25zdCBpbnQgcyA9IGkgPj4gMzE7CisgICAgaSB8PSAoMUw8PDIzKTsKKyAgICBpICY9IH4weEZGMDAwMDAwOworICAgIHJldHVybiBzID8gLWkgOiBpOworfQorCitHTGZsb2F0IGNsYW1wVG9aZXJvZihHTGZsb2F0IHYpIHsKKyNpZiBERUJVR19VU0VfRkxPQVRTCisgICAgcmV0dXJuIHY8MCA/IDAgOiAodj4xID8gMSA6IHYpOworI2Vsc2UKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0ICAgICAgIGY7CisgICAgICAgIGludDMyX3QgICAgIGk7CisgICAgfTsKKyAgICBmID0gdjsKKyAgICBpICY9IH4oaT4+MzEpOworICAgIHJldHVybiBmOworI2VuZGlmCit9CisKK0dMZmxvYXQgcmVjaXByb2NhbGYoR0xmbG9hdCB2KSB7CisgICAgLy8gWFhYOiBkbyBiZXR0ZXIKKyAgICByZXR1cm4gMS4wZiAvIHY7Cit9CisKK0dMZmxvYXQgcnNxcnRmKEdMZmxvYXQgdikgeworICAgIC8vIFhYWDogZG8gYmV0dGVyCisgICAgcmV0dXJuIDEuMGYgLyBzcXJ0Zih2KTsKK30KKworR0xmbG9hdCBzcXJmKEdMZmxvYXQgdikgeworICAgIC8vIFhYWDogZG8gYmV0dGVyCisgICAgcmV0dXJuIHYqdjsKK30KKworR0xmbG9hdCBhZGRFeHBmKEdMZmxvYXQgdiwgaW50IGUpIHsKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0ICAgICAgIGY7CisgICAgICAgIGludDMyX3QgICAgIGk7CisgICAgfTsKKyAgICBmID0gdjsKKyAgICBpZiAoaTw8MSkgeyAvLyBYWFg6IGRlYWwgd2l0aCBvdmVyL3VuZGVyZmxvdwkKKyAgICAgICAgaSArPSBpbnQzMl90KGUpPDwyMzsKKyAgICB9CisgICAgcmV0dXJuIGY7Cit9CisKK0dMZmxvYXQgbXVsMmYoR0xmbG9hdCB2KSB7CisjaWYgREVCVUdfVVNFX0ZMT0FUUworICAgIHJldHVybiB2KjI7CisjZWxzZQorICAgIHJldHVybiBhZGRFeHBmKHYsIDEpOworI2VuZGlmCit9CisKK0dMZmxvYXQgZGl2MmYoR0xmbG9hdCB2KSB7CisjaWYgREVCVUdfVVNFX0ZMT0FUUworICAgIHJldHVybiB2KjAuNWY7CisjZWxzZQorICAgIHJldHVybiBhZGRFeHBmKHYsIC0xKTsKKyNlbmRpZgorfQorCitHTGZsb2F0ICBhYnNmKEdMZmxvYXQgdikgeworI2lmIERFQlVHX1VTRV9GTE9BVFMKKyAgICByZXR1cm4gdjwwID8gLXYgOiB2OworI2Vsc2UKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0ICAgICAgIGY7CisgICAgICAgIGludDMyX3QgICAgIGk7CisgICAgfTsKKyAgICBmID0gdjsKKyAgICBpICY9IH4weDgwMDAwMDAwOworICAgIHJldHVybiBmOworI2VuZGlmCit9CisKK307ICAvLyBuYW1lc3BhY2UgZ2wKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfRlBfSAorCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2l0ZXJhdG9ycy5TIGIvb3BlbmdsL2xpYmFnbC9pdGVyYXRvcnMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWYyOTM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9pdGVyYXRvcnMuUwpAQCAtMCwwICsxLDg4IEBACisvKiBsaWJzL29wZW5nbGVzL2l0ZXJhdG9ycy5TCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCisgICAgLnRleHQKKyAgICAuYWxpZ24KKyAgICAuYXJtCisgICAgCisgICAgLmdsb2JhbCBpdGVyYXRvcnMwMDMyCisKKy8qCisgKiBpdGVyYXRvcnMwMDMyCisgKgorICogTVVTVCBCRSBDQUxMRUQgRlJPTSBBUk0gQ09ERQorICoKKyAqIHIwOiBjb25zdCBjb21wdXRlX2l0ZXJhdG9yc190KiAodGhpcykKKyAqICAgICAgcjAgKyAwOiBtX2R4MDEgCisgKiAgICAgIHIwICsgNDogbV9keTEwCisgKiAgICAgIHIwICsgODogbV9keDIwCisgKiAgICAgIHIwICsxMjogbV9keTAyCisgKiAgICAgIHIwICsxNjogbV94MAorICogICAgICByMCArMjA6IG1feTAKKyAqICAgICAgcjAgKzI0OiBtX2FyZWEKKyAqCQlyMCArMjg6IG1fc2NhbGUKKyAqCQlyMCArMjk6IG1fYXJlYV9zY2FsZTsKKyAqIHIxOiBpbnQzMl90KiAob3V0KQorICogICAgICByMSArIDA6IGMKKyAqICAgICAgcjEgKyA0OiBkY2R4CisgKiAgICAgIHIxICsgODogZGNkeQorICogICByMjogYzAKKyAqICAgcjM6IGMxCisgKiBbc3BdOiBjMgorICovCisgCitpdGVyYXRvcnMwMDMyOgorICAgICAgICBzdG1mZAlzcCEsIHtyNCwgcjUsIHI2LCByNywgcjgsIGxyfQorICAgICAgICBsZHIgICAgIHI0LCBbc3AsICM0KjZdCisKKyAgICAgICAgbGRyYiAgICByMTIsIFtyMCwgIzI5XQorICAgICAgICBzdWIgICAgIHIzLCByMywgcjIKKyAgICAgICAgc3ViICAgICByNCwgcjQsIHIyCisgICAgICAgIHN1YiAgICAgcjEyLCByMTIsICMxNgorICAgICAgICBtb3YgICAgIHIzLCByMywgYXNyIHIxMgorICAgICAgICBtb3YgICAgIHI0LCByNCwgYXNyIHIxMgorICAgICAgICAKKyAgICAgICAgbGRyICAgICByNSwgW3IwLCAjMF0KKyAgICAgICAgbGRyICAgICByMTIsIFtyMCwgIzRdCisgICAgICAgIHNtdWxsICAgcjgsIGxyLCByNCwgcjUKKyAgICAgICAgbGRyICAgICByNSwgW3IwLCAjOF0KKyAgICAgICAgc211bGwgICByNiwgcjcsIHI0LCByMTIKKyAgICAgICAgbGRyICAgICByMTIsIFtyMCwgIzEyXQorICAgICAgICBzbWxhbCAgIHI4LCBsciwgcjMsIHI1CisgICAgICAgIHNtbGFsICAgcjYsIHI3LCByMywgcjEyCisKKyAgICAgICAgbGRyICAgICByMywgW3IwLCAjMTZdICAgICAgICAvLyBtX3gwCisgICAgICAgIGxkciAgICAgcjQsIFtyMCwgIzIwXSAgICAgICAgLy8gbV94MQorICAgICAgICAKKyAgICAgICAgc3RyICAgICByNiwgW3IxLCAjNF0KKyAgICAgICAgc3RyICAgICByOCwgW3IxLCAjOF0KKworICAgICAgICB1bXVsbCAgIHI2LCByNSwgcjMsIHI2CisgICAgICAgIHVtdWxsICAgcjgsIHIwLCByNCwgcjgKKyAgICAgICAgbWxhICAgICByNywgcjMsIHI3LCByNQorICAgICAgICBtbGEgICAgIGxyLCByNCwgbHIsIHIwCisgICAgICAgIGFkZHMgICAgcjYsIHI2LCByOAorICAgICAgICBhZGMgICAgIHI3LCByNywgbHIKKworICAgICAgICBtb3ZzICAgIHI2LCByNiwgbHNyICM0CisgICAgICAgIGFkYyAgICAgcjYsIHI2LCByNywgbHNsICMyOAorICAgICAgICByc2IgICAgIHI2LCByNiwgcjIsIGxzbCAjMTYKKyAgICAgICAgc3RyICAgICByNiwgW3IxLCAjMF0KKworICAgICAgICBsZG1mZAlzcCEsIHtyNCwgcjUsIHI2LCByNywgcjgsIHBjfQorCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2xpZ2h0LmNwcCBiL29wZW5nbC9saWJhZ2wvbGlnaHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YzQxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL2xpZ2h0LmNwcApAQCAtMCwwICsxLDg1MiBAQAorLyogbGlicy9vcGVuZ2xlcy9saWdodC5jcHAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjb250ZXh0LmgiCisjaW5jbHVkZSAiZnAuaCIKKyNpbmNsdWRlICJsaWdodC5oIgorI2luY2x1ZGUgInN0YXRlLmgiCisjaW5jbHVkZSAibWF0cml4LmgiCisKKworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgZGVmaW5lZChfX3RodW1iX18pCisjd2FybmluZyAibGlnaHQuY3BwIHNob3VsZCBub3QgYmUgY29tcGlsZWQgaW4gdGh1bWIgb24gQVJNLiIKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9saWdodGluZyhvZ2xlc19jb250ZXh0X3QqIGMpOworc3RhdGljIHZvaWQgbGlnaHRWZXJ0ZXhWYWxpZGF0ZShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KTsKK3N0YXRpYyB2b2lkIGxpZ2h0VmVydGV4Tm9wKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpOworc3RhdGljIHZvaWQgbGlnaHRWZXJ0ZXgob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdik7CitzdGF0aWMgdm9pZCBsaWdodFZlcnRleE1hdGVyaWFsKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpOworCitzdGF0aWMgaW5saW5lIHZvaWQgdnNjYWxlMyhHTGZpeGVkKiBkLCBjb25zdCBHTGZpeGVkKiBtLCBHTGZpeGVkIHMpOworc3RhdGljIGlubGluZSB2b2lkIHZzdWIzdyhHTGZpeGVkKiBkLCBjb25zdCBHTGZpeGVkKiBhLCBjb25zdCBHTGZpeGVkKiBiKTsKKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK3ZvaWQgdm5vcm0zKEdMZml4ZWQqIGQsIGNvbnN0IEdMZml4ZWQqIGEpOworCitzdGF0aWMgaW5saW5lIHZvaWQgdnNhMyhHTGZpeGVkKiBkLAorICAgIGNvbnN0IEdMZml4ZWQqIG0sIEdMZml4ZWQgcywgY29uc3QgR0xmaXhlZCogYSk7CitzdGF0aWMgaW5saW5lIHZvaWQgdm1sYTMoR0xmaXhlZCogZCwKKyAgICBjb25zdCBHTGZpeGVkKiBtMCwgY29uc3QgR0xmaXhlZCogbTEsIGNvbnN0IEdMZml4ZWQqIGEpOworc3RhdGljIGlubGluZSB2b2lkIHZtdWwzKEdMZml4ZWQqIGQsCisgICAgY29uc3QgR0xmaXhlZCogbTAsIGNvbnN0IEdMZml4ZWQqIG0xKTsKKworc3RhdGljIEdMZml4ZWQgZm9nX2xpbmVhcihvZ2xlc19jb250ZXh0X3QqIGMsIEdMZml4ZWQgeik7CitzdGF0aWMgR0xmaXhlZCBmb2dfZXhwKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCB6KTsKK3N0YXRpYyBHTGZpeGVkIGZvZ19leHAyKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCB6KTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGluaXRfd2hpdGUodmVjNF90JiBjKSB7CisgICAgYy5yID0gYy5nID0gYy5iID0gYy5hID0gMHgxMDAwMDsKK30KKwordm9pZCBvZ2xlc19pbml0X2xpZ2h0KG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpPTAgOyBpPE9HTEVTX01BWF9MSUdIVFMgOyBpKyspIHsKKyAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRzW2ldLmFtYmllbnQuYSA9IDB4MTAwMDA7CisgICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0c1tpXS5wb3NpdGlvbi56ID0gMHgxMDAwMDsKKyAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRzW2ldLnNwb3REaXIueiA9IC0weDEwMDAwOworICAgICAgICBjLT5saWdodGluZy5saWdodHNbaV0uc3BvdEN1dG9mZiA9IGdnbEludFRvRml4ZWQoMTgwKTsKKyAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRzW2ldLmF0dGVudWF0aW9uWzBdID0gMHgxMDAwMDsKKyAgICB9CisgICAgaW5pdF93aGl0ZShjLT5saWdodGluZy5saWdodHNbMF0uZGlmZnVzZSk7CisgICAgaW5pdF93aGl0ZShjLT5saWdodGluZy5saWdodHNbMF0uc3BlY3VsYXIpOworCisgICAgYy0+bGlnaHRpbmcuZnJvbnQuYW1iaWVudC5yID0KKyAgICBjLT5saWdodGluZy5mcm9udC5hbWJpZW50LmcgPQorICAgIGMtPmxpZ2h0aW5nLmZyb250LmFtYmllbnQuYiA9IGdnbEZsb2F0VG9GaXhlZCgwLjJmKTsKKyAgICBjLT5saWdodGluZy5mcm9udC5hbWJpZW50LmEgPSAweDEwMDAwOworICAgIGMtPmxpZ2h0aW5nLmZyb250LmRpZmZ1c2UuciA9CisgICAgYy0+bGlnaHRpbmcuZnJvbnQuZGlmZnVzZS5nID0KKyAgICBjLT5saWdodGluZy5mcm9udC5kaWZmdXNlLmIgPSBnZ2xGbG9hdFRvRml4ZWQoMC44Zik7CisgICAgYy0+bGlnaHRpbmcuZnJvbnQuZGlmZnVzZS5hID0gMHgxMDAwMDsKKyAgICBjLT5saWdodGluZy5mcm9udC5zcGVjdWxhci5hID0gMHgxMDAwMDsKKyAgICBjLT5saWdodGluZy5mcm9udC5lbWlzc2lvbi5hID0gMHgxMDAwMDsKKworICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC5yID0KKyAgICBjLT5saWdodGluZy5saWdodE1vZGVsLmFtYmllbnQuZyA9CisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LmIgPSBnZ2xGbG9hdFRvRml4ZWQoMC4yZik7CisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LmEgPSAweDEwMDAwOworCisgICAgYy0+bGlnaHRpbmcuY29sb3JNYXRlcmlhbC5mYWNlID0gR0xfRlJPTlRfQU5EX0JBQ0s7CisgICAgYy0+bGlnaHRpbmcuY29sb3JNYXRlcmlhbC5tb2RlID0gR0xfQU1CSUVOVF9BTkRfRElGRlVTRTsKKworICAgIGMtPmZvZy5tb2RlID0gR0xfRVhQOworICAgIGMtPmZvZy5mb2cgPSBmb2dfZXhwOworICAgIGMtPmZvZy5kZW5zaXR5ID0gMHgxMDAwMDsKKyAgICBjLT5mb2cuZW5kID0gMHgxMDAwMDsKKyAgICBjLT5mb2cuaW52RW5kTWludXNTdGFydCA9IDB4MTAwMDA7CisKKyAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOworICAgICAgIAorICAgIGMtPnJhc3Rlcml6ZXIucHJvY3Muc2hhZGVNb2RlbChjLCBHTF9TTU9PVEgpOworICAgIGMtPmxpZ2h0aW5nLnNoYWRlTW9kZWwgPSBHTF9TTU9PVEg7Cit9CisKK3ZvaWQgb2dsZXNfdW5pbml0X2xpZ2h0KG9nbGVzX2NvbnRleHRfdCogYykKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IGNsYW1wRihHTGZpeGVkIGYpIENPTlNUOworaW50MzJfdCBjbGFtcEYoR0xmaXhlZCBmKSB7CisgICAgZiA9IChmICYgfihmPj4zMSkpOworICAgIGlmIChmID49IDB4MTAwMDApCisgICAgICAgIGYgPSAweDEwMDAwOworICAgIHJldHVybiBmOworfQorCitzdGF0aWMgR0xmaXhlZCBmb2dfbGluZWFyKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCB6KSB7CisgICAgcmV0dXJuIGNsYW1wRihnZ2xNdWx4KChjLT5mb2cuZW5kIC0gKCh6PDApPy16OnopKSwgYy0+Zm9nLmludkVuZE1pbnVzU3RhcnQpKTsKK30KKworc3RhdGljIEdMZml4ZWQgZm9nX2V4cChvZ2xlc19jb250ZXh0X3QqIGMsIEdMZml4ZWQgeikgeworICAgIGNvbnN0IGZsb2F0IGUgPSBmaXhlZFRvRmxvYXQoZ2dsTXVseChjLT5mb2cuZGVuc2l0eSwgKCh6PDApPy16OnopKSk7CisgICAgcmV0dXJuIGNsYW1wRihnZ2xGbG9hdFRvRml4ZWQoZmFzdGV4cGYoLWUpKSk7Cit9CisKK3N0YXRpYyBHTGZpeGVkIGZvZ19leHAyKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCB6KSB7CisgICAgY29uc3QgZmxvYXQgZSA9IGZpeGVkVG9GbG9hdChnZ2xNdWx4KGMtPmZvZy5kZW5zaXR5LCB6KSk7CisgICAgcmV0dXJuIGNsYW1wRihnZ2xGbG9hdFRvRml4ZWQoZmFzdGV4cGYoLWUqZSkpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgbWF0aCBoZWxwZXJzCisjZW5kaWYKKworc3RhdGljIGlubGluZQordm9pZCB2c2NhbGUzKEdMZml4ZWQqIGQsIGNvbnN0IEdMZml4ZWQqIG0sIEdMZml4ZWQgcykgeworICAgIGRbMF0gPSBnZ2xNdWx4KG1bMF0sIHMpOworICAgIGRbMV0gPSBnZ2xNdWx4KG1bMV0sIHMpOworICAgIGRbMl0gPSBnZ2xNdWx4KG1bMl0sIHMpOworfQorCitzdGF0aWMgaW5saW5lCit2b2lkIHZzYTMoR0xmaXhlZCogZCwgY29uc3QgR0xmaXhlZCogbSwgR0xmaXhlZCBzLCBjb25zdCBHTGZpeGVkKiBhKSB7CisgICAgZFswXSA9IGdnbE11bEFkZHgobVswXSwgcywgYVswXSk7CisgICAgZFsxXSA9IGdnbE11bEFkZHgobVsxXSwgcywgYVsxXSk7CisgICAgZFsyXSA9IGdnbE11bEFkZHgobVsyXSwgcywgYVsyXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgdnN1YjN3KEdMZml4ZWQqIGQsIGNvbnN0IEdMZml4ZWQqIGEsIGNvbnN0IEdMZml4ZWQqIGIpIHsKKyAgICBjb25zdCBHTGZpeGVkIHdhID0gYVszXTsKKyAgICBjb25zdCBHTGZpeGVkIHdiID0gYlszXTsKKyAgICBpZiAoZ2dsX2xpa2VseSh3YSA9PSB3YikpIHsKKyAgICAgICAgZFswXSA9IGFbMF0gLSBiWzBdOworICAgICAgICBkWzFdID0gYVsxXSAtIGJbMV07CisgICAgICAgIGRbMl0gPSBhWzJdIC0gYlsyXTsKKyAgICB9IGVsc2UgeworICAgICAgICBkWzBdID0gZ2dsTXVsU3VieChhWzBdLCB3YiwgZ2dsTXVseChiWzBdLCB3YSkpOworICAgICAgICBkWzFdID0gZ2dsTXVsU3VieChhWzFdLCB3YiwgZ2dsTXVseChiWzFdLCB3YSkpOworICAgICAgICBkWzJdID0gZ2dsTXVsU3VieChhWzJdLCB3YiwgZ2dsTXVseChiWzJdLCB3YSkpOworICAgIH0KK30KKworc3RhdGljIGlubGluZQordm9pZCB2bWxhMyhHTGZpeGVkKiBkLAorICAgICAgICBjb25zdCBHTGZpeGVkKiBtMCwgY29uc3QgR0xmaXhlZCogbTEsIGNvbnN0IEdMZml4ZWQqIGEpCit7CisgICAgZFswXSA9IGdnbE11bEFkZHgobTBbMF0sIG0xWzBdLCBhWzBdKTsKKyAgICBkWzFdID0gZ2dsTXVsQWRkeChtMFsxXSwgbTFbMV0sIGFbMV0pOworICAgIGRbMl0gPSBnZ2xNdWxBZGR4KG0wWzJdLCBtMVsyXSwgYVsyXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgdm11bDMoR0xmaXhlZCogZCwgY29uc3QgR0xmaXhlZCogbTAsIGNvbnN0IEdMZml4ZWQqIG0xKSB7CisgICAgZFswXSA9IGdnbE11bHgobTBbMF0sIG0xWzBdKTsKKyAgICBkWzFdID0gZ2dsTXVseChtMFsxXSwgbTFbMV0pOworICAgIGRbMl0gPSBnZ2xNdWx4KG0wWzJdLCBtMVsyXSk7Cit9CisKK3ZvaWQgdm5vcm0zKEdMZml4ZWQqIGQsIGNvbnN0IEdMZml4ZWQqIGEpCit7CisgICAgLy8gd2UgbXVzdCB0YWtlIGNhcmUgb2Ygb3ZlcmZsb3dzIHdoZW4gbm9ybWFsaXppbmcgYSB2ZWN0b3IKKyAgICBHTGZpeGVkIG47CisgICAgaW50MzJfdCB4ID0gYVswXTsgICB4ID0geD49MCA/IHggOiAteDsKKyAgICBpbnQzMl90IHkgPSBhWzFdOyAgIHkgPSB5Pj0wID8geSA6IC15OworICAgIGludDMyX3QgeiA9IGFbMl07ICAgeiA9IHo+PTAgPyB6IDogLXo7CisgICAgaWYgKGdnbF9saWtlbHkoeDw9MHg2ODAwICYmIHk8PTB4NjgwMCAmJiB6PD0gMHg2ODAwKSkgeworICAgICAgICAvLyBpbiB0aGlzIGNhc2UgdGhpcyB3aWxsIGFsbCBmaXQgb24gMzIgYml0cworICAgICAgICBuID0geCp4ICsgeSp5ICsgeip6OworICAgICAgICBuID0gZ2dsU3FydFJlY2lweChuKTsKKyAgICAgICAgbiA8PD0gODsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBoZXJlIG5vcm1eMiBpcyBhdCBsZWFzdCAweDdFQzAwMDAwICg+PjMyID09IDAuNDk1MTE3KQorICAgICAgICBuID0gdnNxdWFyZTMoeCwgeSwgeik7CisgICAgICAgIG4gPSBnZ2xTcXJ0UmVjaXB4KG4pOworICAgIH0KKyAgICB2c2NhbGUzKGQsIGEsIG4pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBsaWdodGluZyBlcXVhdGlvbnMKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgbGlnaHRfcGlja2VyKG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBpZiAoZ2dsX2xpa2VseSghYy0+bGlnaHRpbmcuZW5hYmxlKSkgeworICAgICAgICBjLT5saWdodGluZy5saWdodFZlcnRleCA9IGxpZ2h0VmVydGV4Tm9wOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChjLT5saWdodGluZy5jb2xvck1hdGVyaWFsLmVuYWJsZSkgeworICAgICAgICBjLT5saWdodGluZy5saWdodFZlcnRleCA9IGxpZ2h0VmVydGV4TWF0ZXJpYWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXggPSBsaWdodFZlcnRleDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2YWxpZGF0ZV9saWdodF9tdmkob2dsZXNfY29udGV4dF90KiBjKQoreworICAgIHVpbnQzMl90IGVuID0gYy0+bGlnaHRpbmcuZW5hYmxlZExpZ2h0czsKKyAgICB3aGlsZSAoZW4pIHsKKyAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIGdnbENseihlbik7CisgICAgICAgIGVuICY9IH4oMTw8aSk7CisgICAgICAgIGxpZ2h0X3QmIGwgPSBjLT5saWdodGluZy5saWdodHNbaV07CisgICAgICAgIGMtPnRyYW5zZm9ybXMubXZ1aS5wb2ludDMoJmMtPnRyYW5zZm9ybXMubXZ1aSwKKyAgICAgICAgICAgICAgICAmbC5vYmpQb3NpdGlvbiwgJmwucG9zaXRpb24pOworICAgICAgICB2bm9ybTMobC5ub3JtYWxpemVkT2JqUG9zaXRpb24udiwgbC5vYmpQb3NpdGlvbi52KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2YWxpZGF0ZV9saWdodChvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgLy8gaWYgY29sb3JNYXRlcmlhbCBpcyBlbmFibGVkLCB3ZSBnZXQgdGhlIGNvbG9yIGZyb20gdGhlIHZlcnRleAorICAgIGlmICghYy0+bGlnaHRpbmcuY29sb3JNYXRlcmlhbC5lbmFibGUpIHsKKyAgICAgICAgbWF0ZXJpYWxfdCYgbWF0ZXJpYWwgPSBjLT5saWdodGluZy5mcm9udDsKKyAgICAgICAgdWludDMyX3QgZW4gPSBjLT5saWdodGluZy5lbmFibGVkTGlnaHRzOworICAgICAgICB3aGlsZSAoZW4pIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBnZ2xDbHooZW4pOworICAgICAgICAgICAgZW4gJj0gfigxPDxpKTsKKyAgICAgICAgICAgIGxpZ2h0X3QmIGwgPSBjLT5saWdodGluZy5saWdodHNbaV07CisgICAgICAgICAgICB2bXVsMyhsLmltcGxpY2l0QW1iaWVudC52LCAgbWF0ZXJpYWwuYW1iaWVudC52LCAgbC5hbWJpZW50LnYpOworICAgICAgICAgICAgdm11bDMobC5pbXBsaWNpdERpZmZ1c2UudiwgIG1hdGVyaWFsLmRpZmZ1c2UudiwgIGwuZGlmZnVzZS52KTsKKyAgICAgICAgICAgIHZtdWwzKGwuaW1wbGljaXRTcGVjdWxhci52LCBtYXRlcmlhbC5zcGVjdWxhci52LCBsLnNwZWN1bGFyLnYpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyB0aGlzIGlzIGp1c3QgYSBmbGFnIHRvIHRlbGwgaWYgd2UgaGF2ZSBhIHNwZWN1bGFyIGNvbXBvbmVudAorICAgICAgICAgICAgbC5pbXBsaWNpdFNwZWN1bGFyLnZbM10gPQorICAgICAgICAgICAgICAgICAgICBsLmltcGxpY2l0U3BlY3VsYXIuciB8CisgICAgICAgICAgICAgICAgICAgIGwuaW1wbGljaXRTcGVjdWxhci5nIHwKKyAgICAgICAgICAgICAgICAgICAgbC5pbXBsaWNpdFNwZWN1bGFyLmI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGwuckNvbnN0QXR0ZW51YXRpb24gPSAobC5hdHRlbnVhdGlvblsxXSB8IGwuYXR0ZW51YXRpb25bMl0pPT0wOworICAgICAgICAgICAgaWYgKGwuckNvbnN0QXR0ZW51YXRpb24pCisgICAgICAgICAgICAgICAgbC5yQ29uc3RBdHRlbnVhdGlvbiA9IGdnbFJlY2lwRmFzdChsLmF0dGVudWF0aW9uWzBdKTsKKyAgICAgICAgfQorICAgICAgICAvLyBlbWlzc2lvbiBhbmQgYW1iaWVudCBmb3IgdGhlIHdob2xlIHNjZW5lCisgICAgICAgIHZtbGEzKCAgYy0+bGlnaHRpbmcuaW1wbGljaXRTY2VuZUVtaXNzaW9uQW5kQW1iaWVudC52LAorICAgICAgICAgICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC52LAorICAgICAgICAgICAgICAgIG1hdGVyaWFsLmFtYmllbnQudiwgCisgICAgICAgICAgICAgICAgbWF0ZXJpYWwuZW1pc3Npb24udik7CisgICAgICAgIGMtPmxpZ2h0aW5nLmltcGxpY2l0U2NlbmVFbWlzc2lvbkFuZEFtYmllbnQuYSA9IG1hdGVyaWFsLmRpZmZ1c2UuYTsKKyAgICB9CisgICAgdmFsaWRhdGVfbGlnaHRfbXZpKGMpOworfQorCit2b2lkIGludmFsaWRhdGVfbGlnaHRpbmcob2dsZXNfY29udGV4dF90KiBjKQoreworICAgIC8vIFRPRE86IHBpY2sgbGlnaHRWZXJ0ZXhWYWxpZGF0ZSBvciBsaWdodFZlcnRleFZhbGlkYXRlTVZJCisgICAgLy8gaW5zdGVhZCBvZiBzeXN0ZW1hdGljYWxseSB0aGUgaGVhdmllciBsaWdodFZlcnRleFZhbGlkYXRlKCkKKyAgICBjLT5saWdodGluZy5saWdodFZlcnRleCA9IGxpZ2h0VmVydGV4VmFsaWRhdGU7Cit9CisKK3ZvaWQgb2dsZXNfaW52YWxpZGF0ZV9saWdodGluZ19tdnVpKG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOworfQorCit2b2lkIGxpZ2h0VmVydGV4Tm9wKG9nbGVzX2NvbnRleHRfdCosIHZlcnRleF90KiB2KQoreworICAgIC8vIHdlIHNob3VsZCBuZXZlciBlbmQtdXAgaGVyZQorfQorCit2b2lkIGxpZ2h0VmVydGV4VmFsaWRhdGVNVkkob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikKK3sKKyAgICB2YWxpZGF0ZV9saWdodF9tdmkoYyk7CisgICAgbGlnaHRfcGlja2VyKGMpOworICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VmVydGV4KGMsIHYpOworfQorCit2b2lkIGxpZ2h0VmVydGV4VmFsaWRhdGUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikKK3sKKyAgICB2YWxpZGF0ZV9saWdodChjKTsKKyAgICBsaWdodF9waWNrZXIoYyk7CisgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXgoYywgdik7Cit9CisKK3ZvaWQgbGlnaHRWZXJ0ZXhNYXRlcmlhbChvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KQoreworICAgIC8vIGZldGNoIHRoZSBtYXRlcmlhbCBjb2xvcgorICAgIGNvbnN0IEdMdm9pZCogY3AgPSBjLT5hcnJheXMuY29sb3IuZWxlbWVudCgKKyAgICAgICAgICAgIHYtPmluZGV4ICYgdmVydGV4X2NhY2hlX3Q6OklOREVYX01BU0spOworICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2LT5jb2xvci52LCBjcCk7CisKKyAgICAvLyBhY3F1aXJlIHRoZSBjb2xvci1tYXRlcmlhbCBmcm9tIHRoZSB2ZXJ0ZXgKKyAgICBtYXRlcmlhbF90JiBtYXRlcmlhbCA9IGMtPmxpZ2h0aW5nLmZyb250OworICAgIG1hdGVyaWFsLmFtYmllbnQgPQorICAgIG1hdGVyaWFsLmRpZmZ1c2UgPSB2LT5jb2xvcjsKKyAgICAvLyBpbXBsaWNpdCBhcmd1bWVudHMgbmVlZCB0byBiZSBjb21wdXRlZCBwZXIvdmVydGV4CisgICAgdWludDMyX3QgZW4gPSBjLT5saWdodGluZy5lbmFibGVkTGlnaHRzOworICAgIHdoaWxlIChlbikgeworICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gZ2dsQ2x6KGVuKTsKKyAgICAgICAgZW4gJj0gfigxPDxpKTsKKyAgICAgICAgbGlnaHRfdCYgbCA9IGMtPmxpZ2h0aW5nLmxpZ2h0c1tpXTsKKyAgICAgICAgdm11bDMobC5pbXBsaWNpdEFtYmllbnQudiwgIG1hdGVyaWFsLmFtYmllbnQudiwgIGwuYW1iaWVudC52KTsKKyAgICAgICAgdm11bDMobC5pbXBsaWNpdERpZmZ1c2UudiwgIG1hdGVyaWFsLmRpZmZ1c2UudiwgIGwuZGlmZnVzZS52KTsKKyAgICAgICAgdm11bDMobC5pbXBsaWNpdFNwZWN1bGFyLnYsIG1hdGVyaWFsLnNwZWN1bGFyLnYsIGwuc3BlY3VsYXIudik7CisgICAgfQorICAgIC8vIGVtaXNzaW9uIGFuZCBhbWJpZW50IGZvciB0aGUgd2hvbGUgc2NlbmUKKyAgICB2bWxhMyggIGMtPmxpZ2h0aW5nLmltcGxpY2l0U2NlbmVFbWlzc2lvbkFuZEFtYmllbnQudiwKKyAgICAgICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC52LAorICAgICAgICAgICAgbWF0ZXJpYWwuYW1iaWVudC52LCAKKyAgICAgICAgICAgIG1hdGVyaWFsLmVtaXNzaW9uLnYpOworICAgIGMtPmxpZ2h0aW5nLmltcGxpY2l0U2NlbmVFbWlzc2lvbkFuZEFtYmllbnQuYSA9IG1hdGVyaWFsLmRpZmZ1c2UuYTsKKworICAgIC8vIG5vdyB3ZSBjYW4gbGlnaHQgb3VyIHZlcnRleCBhcyB1c3VhbAorICAgIGxpZ2h0VmVydGV4KGMsIHYpOworfQorCit2b2lkIGxpZ2h0VmVydGV4KG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCit7CisgICAgLy8gZW1pc3Npb24gYW5kIGFtYmllbnQgZm9yIHRoZSB3aG9sZSBzY2VuZQorICAgIHZlYzRfdCByID0gYy0+bGlnaHRpbmcuaW1wbGljaXRTY2VuZUVtaXNzaW9uQW5kQW1iaWVudDsKKworICAgIHVpbnQzMl90IGVuID0gYy0+bGlnaHRpbmcuZW5hYmxlZExpZ2h0czsKKyAgICBpZiAoZ2dsX2xpa2VseShlbikpIHsKKyAgICAgICAgLy8gc2luY2Ugd2UgZG8gdGhlIGxpZ2h0aW5nIGluIG9iamVjdC1zcGFjZSwgd2UgZG9uJ3QgbmVlZCB0bworICAgICAgICAvLyB0cmFuc2Zvcm0gZWFjaCBub3JtYWwuIEhvd2V2ZXIsIHdlIG1pZ2h0IHN0aWxsIGhhdmUgdG8gbm9ybWFsaXplCisgICAgICAgIC8vIGl0IGlmIEdMX05PUk1BTElaRSBpcyBlbmFibGVkLgorICAgICAgICB2ZWM0X3QgbjsKKyAgICAgICAgYy0+YXJyYXlzLm5vcm1hbC5mZXRjaChjLCBuLnYsCisgICAgICAgICAgICBjLT5hcnJheXMubm9ybWFsLmVsZW1lbnQodi0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSykpOworICAgICAgICBpZiAoYy0+dHJhbnNmb3Jtcy5yZXNjYWxlTm9ybWFscyA9PSBHTF9OT1JNQUxJWkUpCisgICAgICAgICAgICB2bm9ybTMobi52LCBuLnYpOworCisgICAgICAgIGNvbnN0IG1hdGVyaWFsX3QmIG1hdGVyaWFsID0gYy0+bGlnaHRpbmcuZnJvbnQ7CisgICAgICAgIGNvbnN0IGludCB0d29TaWRlID0gYy0+bGlnaHRpbmcubGlnaHRNb2RlbC50d29TaWRlOworCisgICAgICAgIHdoaWxlIChlbikgeworICAgICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIGdnbENseihlbik7CisgICAgICAgICAgICBlbiAmPSB+KDE8PGkpOworICAgICAgICAgICAgY29uc3QgbGlnaHRfdCYgbCA9IGMtPmxpZ2h0aW5nLmxpZ2h0c1tpXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdmVjNF90IGQsIHQ7CisgICAgICAgICAgICBHTGZpeGVkIHM7CisgICAgICAgICAgICBHTGZpeGVkIHNxRGlzdCA9IDB4MTAwMDA7CisKKyAgICAgICAgICAgIC8vIGNvbXB1dGUgdmVydGV4LXRvLWxpZ2h0IHZlY3RvcgorICAgICAgICAgICAgaWYgKGdnbF91bmxpa2VseShsLnBvc2l0aW9uLncpKSB7CisgICAgICAgICAgICAgICAgdnN1YjN3KGQudiwgbC5vYmpQb3NpdGlvbi52LCB2LT5vYmoudik7CisgICAgICAgICAgICAgICAgc3FEaXN0ID0gZG90MyhkLnYsIGQudik7CisgICAgICAgICAgICAgICAgdnNjYWxlMyhkLnYsIGQudiwgZ2dsU3FydFJlY2lweChzcURpc3QpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogYXZvaWQgY29weSBoZXJlCisgICAgICAgICAgICAgICAgZCA9IGwubm9ybWFsaXplZE9ialBvc2l0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhbWJpZW50ICYgZGlmZnVzZQorICAgICAgICAgICAgcyA9IGRvdDMobi52LCBkLnYpOworICAgICAgICAgICAgcyA9IChzPDApID8gKHR3b1NpZGU/KC1zKTowKSA6IHM7CisgICAgICAgICAgICB2c2EzKHQudiwgbC5pbXBsaWNpdERpZmZ1c2UudiwgcywgbC5pbXBsaWNpdEFtYmllbnQudik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIHNwZWN1bGFyCisgICAgICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KHMgJiYgbC5pbXBsaWNpdFNwZWN1bGFyLnZbM10pKSB7CisgICAgICAgICAgICAgICAgdmVjNF90IGg7CisgICAgICAgICAgICAgICAgaC54ID0gZC54OworICAgICAgICAgICAgICAgIGgueSA9IGQueTsKKyAgICAgICAgICAgICAgICBoLnogPSBkLnogKyAweDEwMDAwOworICAgICAgICAgICAgICAgIHZub3JtMyhoLnYsIGgudik7CisgICAgICAgICAgICAgICAgcyA9IGRvdDMobi52LCBoLnYpOworICAgICAgICAgICAgICAgIHMgPSAoczwwKSA/ICh0d29TaWRlPygtcyk6MCkgOiBzOworICAgICAgICAgICAgICAgIGlmIChzID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzID0gZ2dsUG93eChzLCBtYXRlcmlhbC5zaGluaW5lc3MpOworICAgICAgICAgICAgICAgICAgICB2c2EzKHQudiwgbC5pbXBsaWNpdFNwZWN1bGFyLnYsIHMsIHQudik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzcG90CisgICAgICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KGwuc3BvdEN1dG9mZiAhPSBnZ2xJbnRUb0ZpeGVkKDE4MCkpKSB7CisgICAgICAgICAgICAgICAgR0xmaXhlZCBzcG90QXR0ID0gLWRvdDMobC5ub3JtYWxpemVkU3BvdERpci52LCBkLnYpOworICAgICAgICAgICAgICAgIGlmIChzcG90QXR0ID49IGwuc3BvdEN1dG9mZkNvc2luZSkgeworICAgICAgICAgICAgICAgICAgICB2c2NhbGUzKHQudiwgdC52LCBnZ2xQb3d4KHNwb3RBdHQsIGwuc3BvdEV4cCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYXR0ZW51YXRpb24KKyAgICAgICAgICAgIGlmIChnZ2xfdW5saWtlbHkobC5wb3NpdGlvbi53KSkgeworICAgICAgICAgICAgICAgIGlmIChsLnJDb25zdEF0dGVudWF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHMgPSBsLnJDb25zdEF0dGVudWF0aW9uOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHMgPSBnZ2xNdWxBZGR4KHNxRGlzdCwgbC5hdHRlbnVhdGlvblsyXSwgbC5hdHRlbnVhdGlvblswXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsLmF0dGVudWF0aW9uWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGdnbE11bEFkZHgoZ2dsU3FydHgoc3FEaXN0KSwgbC5hdHRlbnVhdGlvblsxXSwgcyk7CisgICAgICAgICAgICAgICAgICAgIHMgPSBnZ2xSZWNpcEZhc3Qocyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZzY2FsZTModC52LCB0LnYsIHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByLnIgKz0gdC5yOworICAgICAgICAgICAgci5nICs9IHQuZzsKKyAgICAgICAgICAgIHIuYiArPSB0LmI7CisgICAgICAgIH0KKyAgICB9CisgICAgdi0+Y29sb3IuciA9IGdnbENsYW1weChyLnIpOworICAgIHYtPmNvbG9yLmcgPSBnZ2xDbGFtcHgoci5nKTsKKyAgICB2LT5jb2xvci5iID0gZ2dsQ2xhbXB4KHIuYik7CisgICAgdi0+Y29sb3IuYSA9IGdnbENsYW1weChyLmEpOworICAgIHYtPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7Cit9CisKK3N0YXRpYyB2b2lkIGxpZ2h0TW9kZWx4KEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSwgb2dsZXNfY29udGV4dF90KiBjKQoreworICAgIGlmIChnZ2xfdW5saWtlbHkocG5hbWUgIT0gR0xfTElHSFRfTU9ERUxfVFdPX1NJREUpKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC50d29TaWRlID0gcGFyYW0gPyBHTF9UUlVFIDogR0xfRkFMU0U7CisgICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKK30KKworc3RhdGljIHZvaWQgbGlnaHR4KEdMZW51bSBpLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0sIG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBpZiAoZ2dsX3VubGlrZWx5KHVpbnQzMl90KGktR0xfTElHSFQwKSA+PSBPR0xFU19NQVhfTElHSFRTKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGlnaHRfdCYgbGlnaHQgPSBjLT5saWdodGluZy5saWdodHNbaS1HTF9MSUdIVDBdOworICAgIGNvbnN0IEdMZml4ZWQga0RlZ1RvUmFkID0gR0xmaXhlZCgoTV9QSSAqIGdnbEludFRvRml4ZWQoMSkpIC8gMTgwLjBmKTsKKyAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgY2FzZSBHTF9TUE9UX0VYUE9ORU5UOgorICAgICAgICBpZiAoR0dMZml4ZWQocGFyYW0pID49IGdnbEludFRvRml4ZWQoMTI4KSkgeworICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbGlnaHQuc3BvdEV4cCA9IHBhcmFtOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NQT1RfQ1VUT0ZGOgorICAgICAgICBpZiAocGFyYW0hPWdnbEludFRvRml4ZWQoMTgwKSAmJiBHR0xmaXhlZChwYXJhbSk+PWdnbEludFRvRml4ZWQoOTApKSB7CisgICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsaWdodC5zcG90Q3V0b2ZmID0gcGFyYW07CisgICAgICAgIGxpZ2h0LnNwb3RDdXRvZmZDb3NpbmUgPSAKKyAgICAgICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoY29zaW5lZigoTV9QSS8oMTgwLjBmKjY1NTM2LjBmKSkqcGFyYW0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTjoKKyAgICAgICAgaWYgKHBhcmFtIDwgMCkgeworICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbGlnaHQuYXR0ZW51YXRpb25bMF0gPSBwYXJhbTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9MSU5FQVJfQVRURU5VQVRJT046CisgICAgICAgIGlmIChwYXJhbSA8IDApIHsKKyAgICAgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxpZ2h0LmF0dGVudWF0aW9uWzFdID0gcGFyYW07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OOgorICAgICAgICBpZiAocGFyYW0gPCAwKSB7CisgICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsaWdodC5hdHRlbnVhdGlvblsyXSA9IHBhcmFtOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludmFsaWRhdGVfbGlnaHRpbmcoYyk7Cit9CisKK3N0YXRpYyB2b2lkIGxpZ2h0eHYoR0xlbnVtIGksIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zLCBvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgaWYgKGdnbF91bmxpa2VseSh1aW50MzJfdChpLUdMX0xJR0hUMCkgPj0gT0dMRVNfTUFYX0xJR0hUUykpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEdMZml4ZWQqIHdoYXQ7CisgICAgbGlnaHRfdCYgbGlnaHQgPSBjLT5saWdodGluZy5saWdodHNbaS1HTF9MSUdIVDBdOworICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICBjYXNlIEdMX0FNQklFTlQ6CisgICAgICAgIHdoYXQgPSBsaWdodC5hbWJpZW50LnY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfRElGRlVTRToKKyAgICAgICAgd2hhdCA9IGxpZ2h0LmRpZmZ1c2UudjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9TUEVDVUxBUjoKKyAgICAgICAgd2hhdCA9IGxpZ2h0LnNwZWN1bGFyLnY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfUE9TSVRJT046IHsKKyAgICAgICAgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtKGMsIHRyYW5zZm9ybV9zdGF0ZV90OjpNT0RFTFZJRVcpOworICAgICAgICB0cmFuc2Zvcm1fdCYgbXYgPSBjLT50cmFuc2Zvcm1zLm1vZGVsdmlldy50cmFuc2Zvcm07CisgICAgICAgIG1lbWNweShsaWdodC5wb3NpdGlvbi52LCBwYXJhbXMsIHNpemVvZihsaWdodC5wb3NpdGlvbi52KSk7CisgICAgICAgIG12LnBvaW50NCgmbXYsICZsaWdodC5wb3NpdGlvbiwgJmxpZ2h0LnBvc2l0aW9uKTsKKyAgICAgICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIEdMX1NQT1RfRElSRUNUSU9OOiB7CisgICAgICAgIG9nbGVzX3ZhbGlkYXRlX3RyYW5zZm9ybShjLCB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZVSSk7CisgICAgICAgIHRyYW5zZm9ybV90JiBtdnVpID0gYy0+dHJhbnNmb3Jtcy5tdnVpOworICAgICAgICBtdnVpLnBvaW50MygmbXZ1aSwgJmxpZ2h0LnNwb3REaXIsICh2ZWM0X3QqKXBhcmFtcyk7CisgICAgICAgIHZub3JtMyhsaWdodC5ub3JtYWxpemVkU3BvdERpci52LCBsaWdodC5zcG90RGlyLnYpOworICAgICAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGxpZ2h0eChpLCBwbmFtZSwgcGFyYW1zWzBdLCBjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB3aGF0WzBdID0gcGFyYW1zWzBdOworICAgIHdoYXRbMV0gPSBwYXJhbXNbMV07CisgICAgd2hhdFsyXSA9IHBhcmFtc1syXTsKKyAgICB3aGF0WzNdID0gcGFyYW1zWzNdOworICAgIGludmFsaWRhdGVfbGlnaHRpbmcoYyk7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGVyaWFseChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtLCBvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgaWYgKGdnbF91bmxpa2VseShmYWNlICE9IEdMX0ZST05UX0FORF9CQUNLKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChnZ2xfdW5saWtlbHkocG5hbWUgIT0gR0xfU0hJTklORVNTKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPmxpZ2h0aW5nLmZyb250LnNoaW5pbmVzcyA9IHBhcmFtOworICAgIGludmFsaWRhdGVfbGlnaHRpbmcoYyk7Cit9CisKK3N0YXRpYyB2b2lkIGZvZ3goR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtLCBvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgc3dpdGNoIChwbmFtZSkgeworICAgIGNhc2UgR0xfRk9HX0RFTlNJVFk6CisgICAgICAgIGlmIChwYXJhbSA+PSAwKSB7CisgICAgICAgICAgICBjLT5mb2cuZGVuc2l0eSA9IHBhcmFtOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfRk9HX1NUQVJUOgorICAgICAgICBjLT5mb2cuc3RhcnQgPSBwYXJhbTsKKyAgICAgICAgYy0+Zm9nLmludkVuZE1pbnVzU3RhcnQgPSBnZ2xSZWNpcChjLT5mb2cuZW5kIC0gYy0+Zm9nLnN0YXJ0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9GT0dfRU5EOgorICAgICAgICBjLT5mb2cuZW5kID0gcGFyYW07CisgICAgICAgIGMtPmZvZy5pbnZFbmRNaW51c1N0YXJ0ID0gZ2dsUmVjaXAoYy0+Zm9nLmVuZCAtIGMtPmZvZy5zdGFydCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfRk9HX01PREU6CisgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgY2FzZSBHTF9MSU5FQVI6CisgICAgICAgICAgICBjLT5mb2cubW9kZSA9IHBhcmFtOworICAgICAgICAgICAgYy0+Zm9nLmZvZyA9IGZvZ19saW5lYXI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9FWFA6CisgICAgICAgICAgICBjLT5mb2cubW9kZSA9IHBhcmFtOworICAgICAgICAgICAgYy0+Zm9nLmZvZyA9IGZvZ19leHA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9FWFAyOgorICAgICAgICAgICAgYy0+Zm9nLm1vZGUgPSBwYXJhbTsKKyAgICAgICAgICAgIGMtPmZvZy5mb2cgPSBmb2dfZXhwMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKyNpZiAwCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIGxpZ2h0aW5nIEFQSXMKKyNlbmRpZgorCit2b2lkIGdsU2hhZGVNb2RlbChHTGVudW0gbW9kZSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmIChnZ2xfdW5saWtlbHkobW9kZSAhPSBHTF9TTU9PVEggJiYgbW9kZSAhPSBHTF9GTEFUKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPmxpZ2h0aW5nLnNoYWRlTW9kZWwgPSBtb2RlOworfQorCit2b2lkIGdsTGlnaHRNb2RlbGYoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgbGlnaHRNb2RlbHgocG5hbWUsIGdnbEZsb2F0VG9GaXhlZChwYXJhbSksIGMpOworfQorCit2b2lkIGdsTGlnaHRNb2RlbHgoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgbGlnaHRNb2RlbHgocG5hbWUsIHBhcmFtLCBjKTsKK30KKwordm9pZCBnbExpZ2h0TW9kZWxmdihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmIChwbmFtZSA9PSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSkgeworICAgICAgICBsaWdodE1vZGVseChwbmFtZSwgZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1swXSksIGMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGdnbF91bmxpa2VseShwbmFtZSAhPSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LnIgPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzBdKTsKKyAgICBjLT5saWdodGluZy5saWdodE1vZGVsLmFtYmllbnQuZyA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMV0pOworICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC5iID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1syXSk7CisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LmEgPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzNdKTsKKyAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOworfQorCit2b2lkIGdsTGlnaHRNb2RlbHh2KEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKHBuYW1lID09IEdMX0xJR0hUX01PREVMX1RXT19TSURFKSB7CisgICAgICAgIGxpZ2h0TW9kZWx4KHBuYW1lLCBwYXJhbXNbMF0sIGMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGdnbF91bmxpa2VseShwbmFtZSAhPSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LnIgPSBwYXJhbXNbMF07CisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LmcgPSBwYXJhbXNbMV07CisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LmIgPSBwYXJhbXNbMl07CisgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LmEgPSBwYXJhbXNbM107CisgICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjZW5kaWYKKwordm9pZCBnbExpZ2h0ZihHTGVudW0gaSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgbGlnaHR4KGksIHBuYW1lLCBnZ2xGbG9hdFRvRml4ZWQocGFyYW0pLCBjKTsKK30KKwordm9pZCBnbExpZ2h0eChHTGVudW0gaSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgbGlnaHR4KGksIHBuYW1lLCBwYXJhbSwgYyk7Cit9CisKK3ZvaWQgZ2xMaWdodGZ2KEdMZW51bSBpLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICBjYXNlIEdMX1NQT1RfRVhQT05FTlQ6CisgICAgY2FzZSBHTF9TUE9UX0NVVE9GRjoKKyAgICBjYXNlIEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OOgorICAgIGNhc2UgR0xfTElORUFSX0FUVEVOVUFUSU9OOgorICAgIGNhc2UgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OOgorICAgICAgICBsaWdodHgoaSwgcG5hbWUsIGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMF0pLCBjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEdMZml4ZWQgcGFyYW1zeFs0XTsKKyAgICBwYXJhbXN4WzBdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1swXSk7CisgICAgcGFyYW1zeFsxXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMV0pOworICAgIHBhcmFtc3hbMl0gPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzJdKTsKKyAgICBpZiAocG5hbWUgIT0gR0xfU1BPVF9ESVJFQ1RJT04pCisgICAgICAgIHBhcmFtc3hbM10gPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzNdKTsKKworICAgIGxpZ2h0eHYoaSwgcG5hbWUsIHBhcmFtc3gsIGMpOworfQorCit2b2lkIGdsTGlnaHR4dihHTGVudW0gaSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBsaWdodHh2KGksIHBuYW1lLCBwYXJhbXMsIGMpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNlbmRpZgorCit2b2lkIGdsTWF0ZXJpYWxmKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBtYXRlcmlhbHgoZmFjZSwgcG5hbWUsIGdnbEZsb2F0VG9GaXhlZChwYXJhbSksIGMpOworfQorCit2b2lkIGdsTWF0ZXJpYWx4KEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBtYXRlcmlhbHgoZmFjZSwgcG5hbWUsIHBhcmFtLCBjKTsKK30KKwordm9pZCBnbE1hdGVyaWFsZnYoCisgICAgR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKGdnbF91bmxpa2VseShmYWNlICE9IEdMX0ZST05UX0FORF9CQUNLKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEdMZml4ZWQqIHdoYXQ9MDsKKyAgICBHTGZpeGVkKiBvdGhlcj0wOworICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICBjYXNlIEdMX0FNQklFTlQ6ICAgIHdoYXQgPSBjLT5saWdodGluZy5mcm9udC5hbWJpZW50LnY7IGJyZWFrOworICAgIGNhc2UgR0xfRElGRlVTRTogICAgd2hhdCA9IGMtPmxpZ2h0aW5nLmZyb250LmRpZmZ1c2UudjsgYnJlYWs7CisgICAgY2FzZSBHTF9TUEVDVUxBUjogICB3aGF0ID0gYy0+bGlnaHRpbmcuZnJvbnQuc3BlY3VsYXIudjsgYnJlYWs7CisgICAgY2FzZSBHTF9FTUlTU0lPTjogICB3aGF0ID0gYy0+bGlnaHRpbmcuZnJvbnQuZW1pc3Npb24udjsgYnJlYWs7CisgICAgY2FzZSBHTF9BTUJJRU5UX0FORF9ESUZGVVNFOgorICAgICAgICB3aGF0ICA9IGMtPmxpZ2h0aW5nLmZyb250LmFtYmllbnQudjsgYnJlYWs7CisgICAgICAgIG90aGVyID0gYy0+bGlnaHRpbmcuZnJvbnQuZGlmZnVzZS52OyBicmVhazsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9TSElOSU5FU1M6CisgICAgICAgIGMtPmxpZ2h0aW5nLmZyb250LnNoaW5pbmVzcyA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMF0pOworICAgICAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOworICAgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB3aGF0WzBdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1swXSk7CisgICAgd2hhdFsxXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMV0pOworICAgIHdoYXRbMl0gPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzJdKTsKKyAgICB3aGF0WzNdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1szXSk7CisgICAgaWYgKG90aGVyKSB7CisgICAgICAgIG90aGVyWzBdID0gd2hhdFswXTsKKyAgICAgICAgb3RoZXJbMV0gPSB3aGF0WzFdOworICAgICAgICBvdGhlclsyXSA9IHdoYXRbMl07CisgICAgICAgIG90aGVyWzNdID0gd2hhdFszXTsKKyAgICB9CisgICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKK30KKwordm9pZCBnbE1hdGVyaWFseHYoCisgICAgR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKGdnbF91bmxpa2VseShmYWNlICE9IEdMX0ZST05UX0FORF9CQUNLKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEdMZml4ZWQqIHdoYXQ9MDsKKyAgICBHTGZpeGVkKiBvdGhlcj0wOworICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICBjYXNlIEdMX0FNQklFTlQ6ICAgIHdoYXQgPSBjLT5saWdodGluZy5mcm9udC5hbWJpZW50LnY7IGJyZWFrOworICAgIGNhc2UgR0xfRElGRlVTRTogICAgd2hhdCA9IGMtPmxpZ2h0aW5nLmZyb250LmRpZmZ1c2UudjsgYnJlYWs7CisgICAgY2FzZSBHTF9TUEVDVUxBUjogICB3aGF0ID0gYy0+bGlnaHRpbmcuZnJvbnQuc3BlY3VsYXIudjsgYnJlYWs7CisgICAgY2FzZSBHTF9FTUlTU0lPTjogICB3aGF0ID0gYy0+bGlnaHRpbmcuZnJvbnQuZW1pc3Npb24udjsgYnJlYWs7CisgICAgY2FzZSBHTF9BTUJJRU5UX0FORF9ESUZGVVNFOgorICAgICAgICB3aGF0ID0gYy0+bGlnaHRpbmcuZnJvbnQuYW1iaWVudC52OyBicmVhazsKKyAgICAgICAgb3RoZXI9IGMtPmxpZ2h0aW5nLmZyb250LmRpZmZ1c2UudjsgYnJlYWs7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfU0hJTklORVNTOgorICAgICAgICBjLT5saWdodGluZy5mcm9udC5zaGluaW5lc3MgPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzBdKTsKKyAgICAgICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKKyAgICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgd2hhdFswXSA9IHBhcmFtc1swXTsKKyAgICB3aGF0WzFdID0gcGFyYW1zWzFdOworICAgIHdoYXRbMl0gPSBwYXJhbXNbMl07CisgICAgd2hhdFszXSA9IHBhcmFtc1szXTsKKyAgICBpZiAob3RoZXIpIHsKKyAgICAgICAgb3RoZXJbMF0gPSB3aGF0WzBdOworICAgICAgICBvdGhlclsxXSA9IHdoYXRbMV07CisgICAgICAgIG90aGVyWzJdID0gd2hhdFsyXTsKKyAgICAgICAgb3RoZXJbM10gPSB3aGF0WzNdOworICAgIH0KKyAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBmb2cKKyNlbmRpZgorCit2b2lkIGdsRm9nZihHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIEdMZml4ZWQgcGFyYW14ID0gKEdMZml4ZWQpcGFyYW07CisgICAgaWYgKHBuYW1lICE9IEdMX0ZPR19NT0RFKQorICAgICAgICBwYXJhbXggPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW0pOworICAgIGZvZ3gocG5hbWUsIHBhcmFteCwgYyk7Cit9CisKK3ZvaWQgZ2xGb2d4KEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgZm9neChwbmFtZSwgcGFyYW0sIGMpOworfQorCit2b2lkIGdsRm9nZnYoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAocG5hbWUgIT0gR0xfRk9HX0NPTE9SKSB7CisgICAgICAgIEdMZml4ZWQgcGFyYW14ID0gKEdMZml4ZWQpcGFyYW1zWzBdOworICAgICAgICBpZiAocG5hbWUgIT0gR0xfRk9HX01PREUpCisgICAgICAgICAgICBwYXJhbXggPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzBdKTsKKyAgICAgICAgZm9neChwbmFtZSwgcGFyYW14LCBjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBHTGZpeGVkIHBhcmFtc3hbNF07CisgICAgcGFyYW1zeFswXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMF0pOworICAgIHBhcmFtc3hbMV0gPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzFdKTsKKyAgICBwYXJhbXN4WzJdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1syXSk7CisgICAgcGFyYW1zeFszXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbM10pOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZm9nQ29sb3IzeHYoYywgcGFyYW1zeCk7Cit9CisKK3ZvaWQgZ2xGb2d4dihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmIChwbmFtZSAhPSBHTF9GT0dfQ09MT1IpIHsKKyAgICAgICAgZm9neChwbmFtZSwgcGFyYW1zWzBdLCBjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmZvZ0NvbG9yM3h2KGMsIHBhcmFtcyk7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2xpZ2h0LmggYi9vcGVuZ2wvbGliYWdsL2xpZ2h0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhZTI1ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJhZ2wvbGlnaHQuaApAQCAtMCwwICsxLDM4IEBACisvKiBsaWJzL29wZW5nbGVzL2xpZ2h0LmgKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfTElHSFRfSAorI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX0xJR0hUX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBnbCB7CitzdHJ1Y3Qgb2dsZXNfY29udGV4dF90OworfTsKKwordm9pZCBvZ2xlc19pbml0X2xpZ2h0KG9nbGVzX2NvbnRleHRfdCogYyk7Cit2b2lkIG9nbGVzX3VuaW5pdF9saWdodChvZ2xlc19jb250ZXh0X3QqIGMpOwordm9pZCBvZ2xlc19pbnZhbGlkYXRlX2xpZ2h0aW5nX212dWkob2dsZXNfY29udGV4dF90KiBjKTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfTElHSFRfSAorCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL21hdHJpeC5jcHAgYi9vcGVuZ2wvbGliYWdsL21hdHJpeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE3NWNkYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJhZ2wvbWF0cml4LmNwcApAQCAtMCwwICsxLDExNDUgQEAKKy8qIGxpYnMvb3BlbmdsZXMvbWF0cml4LmNwcAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiY29udGV4dC5oIgorI2luY2x1ZGUgImZwLmgiCisjaW5jbHVkZSAic3RhdGUuaCIKKyNpbmNsdWRlICJtYXRyaXguaCIKKyNpbmNsdWRlICJ2ZXJ0ZXguaCIKKyNpbmNsdWRlICJsaWdodC5oIgorCisjaWYgZGVmaW5lZChfX2FybV9fKSAmJiBkZWZpbmVkKF9fdGh1bWJfXykKKyN3YXJuaW5nICJtYXRyaXguY3BwIHNob3VsZCBub3QgYmUgY29tcGlsZWQgaW4gdGh1bWIgb24gQVJNLiIKKyNlbmRpZgorCisjZGVmaW5lIEkoX2ksIF9qKSAoKF9qKSsgNCooX2kpKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGNvbnN0IEdMZmxvYXQgZ0lkZW50aXR5ZlsxNl0gPSB7IDEsMCwwLDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwxLDAsMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDAsMSwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCwwLDEgfTsKKworc3RhdGljIGNvbnN0IG1hdHJpeHhfdCBnSWRlbnRpdHl4ID0geyAKKyAgICAgICAgICAgIHsgICAweDEwMDAwLDAsMCwwLAorICAgICAgICAgICAgICAgIDAsMHgxMDAwMCwwLDAsCisgICAgICAgICAgICAgICAgMCwwLDB4MTAwMDAsMCwKKyAgICAgICAgICAgICAgICAwLDAsMCwweDEwMDAwCisgICAgICAgICAgICB9CisgICAgICAgIH07CisKK3N0YXRpYyB2b2lkIHBvaW50Ml9fbm9wKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBjLCB2ZWM0X3QgY29uc3QqIG8pOworc3RhdGljIHZvaWQgcG9pbnQzX19ub3AodHJhbnNmb3JtX3QgY29uc3QqLCB2ZWM0X3QqIGMsIHZlYzRfdCBjb25zdCogbyk7CitzdGF0aWMgdm9pZCBwb2ludDRfX25vcCh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCogYywgdmVjNF90IGNvbnN0KiBvKTsKK3N0YXRpYyB2b2lkIG5vcm1hbF9fbm9wKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBjLCB2ZWM0X3QgY29uc3QqIG8pOworc3RhdGljIHZvaWQgcG9pbnQyX19nZW5lcmljKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBjLCB2ZWM0X3QgY29uc3QqIG8pOworc3RhdGljIHZvaWQgcG9pbnQzX19nZW5lcmljKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBjLCB2ZWM0X3QgY29uc3QqIG8pOworc3RhdGljIHZvaWQgcG9pbnQ0X19nZW5lcmljKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBjLCB2ZWM0X3QgY29uc3QqIG8pOworc3RhdGljIHZvaWQgbm9ybWFsX19nZW5lcmljKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBjLCB2ZWM0X3QgY29uc3QqIG8pOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNlbmRpZgorCit2b2lkIG9nbGVzX2luaXRfbWF0cml4KG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBjLT50cmFuc2Zvcm1zLm1vZGVsdmlldy5pbml0KE9HTEVTX01PREVMVklFV19TVEFDS19ERVBUSCk7CisgICAgYy0+dHJhbnNmb3Jtcy5wcm9qZWN0aW9uLmluaXQoT0dMRVNfUFJPSkVDVElPTl9TVEFDS19ERVBUSCk7CisgICAgZm9yIChpbnQgaT0wOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspCisgICAgICAgIGMtPnRyYW5zZm9ybXMudGV4dHVyZVtpXS5pbml0KE9HTEVTX1RFWFRVUkVfU1RBQ0tfREVQVEgpOworCisgICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50ID0gJmMtPnRyYW5zZm9ybXMubW9kZWx2aWV3OworICAgIGMtPnRyYW5zZm9ybXMubWF0cml4TW9kZSA9IEdMX01PREVMVklFVzsKKyAgICBjLT50cmFuc2Zvcm1zLmRpcnR5ID0gICB0cmFuc2Zvcm1fc3RhdGVfdDo6VklFV1BPUlQgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZVSSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3N0YXRlX3Q6Ok1WSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybV9zdGF0ZV90OjpNVlA7CisgICAgYy0+dHJhbnNmb3Jtcy5tdnAubG9hZElkZW50aXR5KCk7CisgICAgYy0+dHJhbnNmb3Jtcy5tdnA0LmxvYWRJZGVudGl0eSgpOworICAgIGMtPnRyYW5zZm9ybXMubXZpdDQubG9hZElkZW50aXR5KCk7CisgICAgYy0+dHJhbnNmb3Jtcy5tdnVpLmxvYWRJZGVudGl0eSgpOworICAgIGMtPnRyYW5zZm9ybXMudnB0LmxvYWRJZGVudGl0eSgpOworICAgIGMtPnRyYW5zZm9ybXMudnB0LnpOZWFyID0gMC4wZjsKKyAgICBjLT50cmFuc2Zvcm1zLnZwdC56RmFyICA9IDEuMGY7Cit9CisKK3ZvaWQgb2dsZXNfdW5pbml0X21hdHJpeChvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgYy0+dHJhbnNmb3Jtcy5tb2RlbHZpZXcudW5pbml0KCk7CisgICAgYy0+dHJhbnNmb3Jtcy5wcm9qZWN0aW9uLnVuaW5pdCgpOworICAgIGZvciAoaW50IGk9MDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKQorICAgICAgICBjLT50cmFuc2Zvcm1zLnRleHR1cmVbaV0udW5pbml0KCk7Cit9CisKK3N0YXRpYyB2b2lkIHZhbGlkYXRlX3BlcnNwZWN0aXZlKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCit7CisgICAgY29uc3QgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKKyAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUgPSAoYy0+Y2xpcFBsYW5lcy5lbmFibGUpID8KKyAgICAgICAgb2dsZXNfdmVydGV4X2NsaXBBbGxQZXJzcGVjdGl2ZTNEIDogb2dsZXNfdmVydGV4X3BlcnNwZWN0aXZlM0Q7CisgICAgaWYgKGVuYWJsZXMgJiAoR0dMX0VOQUJMRV9ERVBUSF9URVNUfEdHTF9FTkFCTEVfRk9HKSkgeworICAgICAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUgPSBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUzRFo7CisgICAgICAgIGlmIChjLT5jbGlwUGxhbmVzLmVuYWJsZSB8fCAoZW5hYmxlcyZHR0xfRU5BQkxFX0ZPRykpCisgICAgICAgICAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUgPSBvZ2xlc192ZXJ0ZXhfY2xpcEFsbFBlcnNwZWN0aXZlM0RaOworICAgIH0KKyAgICBpZiAoKGMtPmFycmF5cy52ZXJ0ZXguc2l6ZSAhPSA0KSAmJgorICAgICAgICAoYy0+dHJhbnNmb3Jtcy5tdnA0LmZsYWdzICYgdHJhbnNmb3JtX3Q6OkZMQUdTXzJEX1BST0pFQ1RJT04pKSB7CisgICAgICAgIGMtPmFycmF5cy5wZXJzcGVjdGl2ZSA9IG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTJEOworICAgIH0KKyAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUoYywgdik7Cit9CisKK3ZvaWQgb2dsZXNfaW52YWxpZGF0ZV9wZXJzcGVjdGl2ZShvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgYy0+YXJyYXlzLnBlcnNwZWN0aXZlID0gdmFsaWRhdGVfcGVyc3BlY3RpdmU7Cit9CisKK3ZvaWQgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtX2ltcGwob2dsZXNfY29udGV4dF90KiBjLCB1aW50MzJfdCB3YW50KQoreworICAgIGludCBkaXJ0eSA9IGMtPnRyYW5zZm9ybXMuZGlydHkgJiB3YW50OworCisgICAgLy8gVmFsaWRhdGUgdGhlIG1vZGVsdmlldworICAgIGlmIChkaXJ0eSAmIHRyYW5zZm9ybV9zdGF0ZV90OjpNT0RFTFZJRVcpIHsKKyAgICAgICAgYy0+dHJhbnNmb3Jtcy5tb2RlbHZpZXcudmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSB0aGUgcHJvamVjdGlvbiBzdGFjayAoaW4gZmFjdCwgaXQncyBuZXZlciBuZWVkZWQpCisgICAgaWYgKGRpcnR5ICYgdHJhbnNmb3JtX3N0YXRlX3Q6OlBST0pFQ1RJT04pIHsKKyAgICAgICAgYy0+dHJhbnNmb3Jtcy5wcm9qZWN0aW9uLnZhbGlkYXRlKCk7CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgdGhlIHZpZXdwb3J0IHRyYW5zZm9ybWF0aW9uCisgICAgaWYgKGRpcnR5ICYgdHJhbnNmb3JtX3N0YXRlX3Q6OlZJRVdQT1JUKSB7CisgICAgICAgIHZwX3RyYW5zZm9ybV90JiB2cHQgPSBjLT50cmFuc2Zvcm1zLnZwdDsKKyAgICAgICAgdnB0LnRyYW5zZm9ybS5tYXRyaXgubG9hZCh2cHQubWF0cml4KTsKKyAgICAgICAgdnB0LnRyYW5zZm9ybS5waWNrZXIoKTsKKyAgICB9CisKKyAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgbXZwICh1c2VkIHRvIHRyYW5zZm9ybSBlYWNoIHZlcnRleCkKKyAgICBpZiAoZGlydHkgJiB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZQKSB7CisgICAgICAgIGMtPnRyYW5zZm9ybXMudXBkYXRlX212cCgpOworICAgICAgICAvLyBpbnZhbGlkYXRlIHBlcnNwZWN0aXZlIChkaXZpZGUgYnkgVykgYW5kIHZpZXcgdm9sdW1lIGNsaXBwaW5nCisgICAgICAgIG9nbGVzX2ludmFsaWRhdGVfcGVyc3BlY3RpdmUoYyk7CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgdGhlIG12dWkgKGZvciBub3JtYWwgdHJhbnNmb3JtYXRpb24pCisgICAgaWYgKGRpcnR5ICYgdHJhbnNmb3JtX3N0YXRlX3Q6Ok1WVUkpIHsKKyAgICAgICAgYy0+dHJhbnNmb3Jtcy51cGRhdGVfbXZ1aSgpOworICAgICAgICBvZ2xlc19pbnZhbGlkYXRlX2xpZ2h0aW5nX212dWkoYyk7CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgdGhlIHRleHR1cmUgc3RhY2sKKyAgICBpZiAoZGlydHkgJiB0cmFuc2Zvcm1fc3RhdGVfdDo6VEVYVFVSRSkgeworICAgICAgICBmb3IgKGludCBpPTA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykKKyAgICAgICAgICAgIGMtPnRyYW5zZm9ybXMudGV4dHVyZVtpXS52YWxpZGF0ZSgpOworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIHRoZSBtdml0NCAodXNlci1jbGlwIHBsYW5lcykKKyAgICBpZiAoZGlydHkgJiB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZJVCkgeworICAgICAgICBjLT50cmFuc2Zvcm1zLnVwZGF0ZV9tdml0KCk7CisgICAgfQorCisgICAgYy0+dHJhbnNmb3Jtcy5kaXJ0eSAmPSB+d2FudDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgdHJhbnNmb3JtX3QKKyNlbmRpZgorCit2b2lkIHRyYW5zZm9ybV90Ojpsb2FkSWRlbnRpdHkoKSB7CisgICAgbWF0cml4ID0gZ0lkZW50aXR5eDsKKyAgICBmbGFncyA9IDA7CisgICAgb3BzID0gT1BfSURFTlRJVFk7CisgICAgcG9pbnQyID0gcG9pbnQyX19ub3A7CisgICAgcG9pbnQzID0gcG9pbnQzX19ub3A7CisgICAgcG9pbnQ0ID0gcG9pbnQ0X19ub3A7Cit9CisKKworc3RhdGljIGlubGluZQoraW50IG5vdFplcm8oR0xmaXhlZCB2KSB7CisgICAgcmV0dXJuIGFicyh2KSAmIH4weDM7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2ludCBub3RPbmUoR0xmaXhlZCB2KSB7CisgICAgcmV0dXJuIG5vdFplcm8odiAtIDB4MTAwMDApOworfQorCit2b2lkIHRyYW5zZm9ybV90OjpwaWNrZXIoKQoreworICAgIGNvbnN0IEdMZml4ZWQqIGNvbnN0IG0gPSBtYXRyaXgubTsKKworICAgIC8vIFhYWDogcGlja2VyIG5lZWRzIHRvIGJlIHNtYXJ0ZXIKKyAgICBmbGFncyA9IDA7CisgICAgb3BzID0gT1BfQUxMOworICAgIHBvaW50MiA9IHBvaW50Ml9fZ2VuZXJpYzsKKyAgICBwb2ludDMgPSBwb2ludDNfX2dlbmVyaWM7CisgICAgcG9pbnQ0ID0gcG9pbnQ0X19nZW5lcmljOworICAgIAorICAgIC8vIGZpbmQgb3V0IGlmIHRoaXMgaXMgYSAyRCBwcm9qZWN0aW9uCisgICAgaWYgKCEobm90WmVybyhtWzNdKSB8IG5vdFplcm8obVs3XSkgfCBub3RaZXJvKG1bMTFdKSB8IG5vdE9uZShtWzE1XSkpKSB7CisgICAgICAgIGZsYWdzIHw9IEZMQUdTXzJEX1BST0pFQ1RJT047CisgICAgfQorfQorCit2b2lkIG12dWlfdHJhbnNmb3JtX3Q6OnBpY2tlcigpCit7CisgICAgZmxhZ3MgPSAwOworICAgIG9wcyA9IE9QX0FMTDsKKyAgICBwb2ludDMgPSBub3JtYWxfX2dlbmVyaWM7Cit9CisKK3ZvaWQgdHJhbnNmb3JtX3Q6OmR1bXAoY29uc3QgY2hhciogd2hhdCkKK3sKKyAgICBHTGZpeGVkIGNvbnN0ICogY29uc3QgbSA9IG1hdHJpeC5tOworICAgIExPR0QoIiVzOiIsIHdoYXQpOworICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykKKyAgICAgICAgTE9HRCgiWyUwOHggJTA4eCAlMDh4ICUwOHhdIFslZiAlZiAlZiAlZl1cbiIsCisgICAgICAgICAgICBtW0koMCxpKV0sIG1bSSgxLGkpXSwgbVtJKDIsaSldLCBtW0koMyxpKV0sCisgICAgICAgICAgICBmaXhlZFRvRmxvYXQobVtJKDAsaSldKSwKKyAgICAgICAgICAgIGZpeGVkVG9GbG9hdChtW0koMSxpKV0pLCAKKyAgICAgICAgICAgIGZpeGVkVG9GbG9hdChtW0koMixpKV0pLAorICAgICAgICAgICAgZml4ZWRUb0Zsb2F0KG1bSSgzLGkpXSkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBtYXRyaXh4X3QKKyNlbmRpZgorCit2b2lkIG1hdHJpeHhfdDo6bG9hZChjb25zdCBtYXRyaXhmX3QmIHJocykgeworICAgIEdMZml4ZWQqIHhwID0gbTsKKyAgICBHTGZsb2F0IGNvbnN0KiBmcCA9IHJocy5lbGVtZW50cygpOworICAgIHVuc2lnbmVkIGludCBpID0gMTY7CisgICAgZG8geworICAgICAgICBjb25zdCBHTGZsb2F0IGYgPSAqZnArKzsKKyAgICAgICAgKnhwKysgPSBpc1plcm9mKGYpID8gMCA6IGdnbEZsb2F0VG9GaXhlZChmKTsKKyAgICB9IHdoaWxlICgtLWkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBtYXRyaXhmX3QKKyNlbmRpZgorCit2b2lkIG1hdHJpeGZfdDo6bXVsdGlwbHkobWF0cml4Zl90JiByLCBjb25zdCBtYXRyaXhmX3QmIGxocywgY29uc3QgbWF0cml4Zl90JiByaHMpCit7CisgICAgR0xmbG9hdCBjb25zdCogY29uc3QgbSA9IGxocy5tOworICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICByZWdpc3RlciBjb25zdCBmbG9hdCByaHNfaTAgPSByaHMubVsgSShpLDApIF07CisgICAgICAgIHJlZ2lzdGVyIGZsb2F0IHJpMCA9IG1bIEkoMCwwKSBdICogcmhzX2kwOworICAgICAgICByZWdpc3RlciBmbG9hdCByaTEgPSBtWyBJKDAsMSkgXSAqIHJoc19pMDsKKyAgICAgICAgcmVnaXN0ZXIgZmxvYXQgcmkyID0gbVsgSSgwLDIpIF0gKiByaHNfaTA7CisgICAgICAgIHJlZ2lzdGVyIGZsb2F0IHJpMyA9IG1bIEkoMCwzKSBdICogcmhzX2kwOworICAgICAgICBmb3IgKGludCBqPTEgOyBqPDQgOyBqKyspIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IGZsb2F0IHJoc19paiA9IHJocy5tWyBJKGksaikgXTsKKyAgICAgICAgICAgIHJpMCArPSBtWyBJKGosMCkgXSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMSArPSBtWyBJKGosMSkgXSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMiArPSBtWyBJKGosMikgXSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMyArPSBtWyBJKGosMykgXSAqIHJoc19pajsKKyAgICAgICAgfQorICAgICAgICByLm1bIEkoaSwwKSBdID0gcmkwOworICAgICAgICByLm1bIEkoaSwxKSBdID0gcmkxOworICAgICAgICByLm1bIEkoaSwyKSBdID0gcmkyOworICAgICAgICByLm1bIEkoaSwzKSBdID0gcmkzOworICAgIH0KK30KKwordm9pZCBtYXRyaXhmX3Q6OmR1bXAoY29uc3QgY2hhciogd2hhdCkgeworICAgIExPR0QoIiVzIiwgd2hhdCk7CisgICAgTE9HRCgiWyAlOWYgJTlmICU5ZiAlOWYgXSIsIG1bSSgwLDApXSwgbVtJKDEsMCldLCBtW0koMiwwKV0sIG1bSSgzLDApXSk7CisgICAgTE9HRCgiWyAlOWYgJTlmICU5ZiAlOWYgXSIsIG1bSSgwLDEpXSwgbVtJKDEsMSldLCBtW0koMiwxKV0sIG1bSSgzLDEpXSk7CisgICAgTE9HRCgiWyAlOWYgJTlmICU5ZiAlOWYgXSIsIG1bSSgwLDIpXSwgbVtJKDEsMildLCBtW0koMiwyKV0sIG1bSSgzLDIpXSk7CisgICAgTE9HRCgiWyAlOWYgJTlmICU5ZiAlOWYgXSIsIG1bSSgwLDMpXSwgbVtJKDEsMyldLCBtW0koMiwzKV0sIG1bSSgzLDMpXSk7Cit9CisKK3ZvaWQgbWF0cml4Zl90Ojpsb2FkSWRlbnRpdHkoKSB7CisgICAgbWVtY3B5KG0sIGdJZGVudGl0eWYsIHNpemVvZihtKSk7Cit9CisKK3ZvaWQgbWF0cml4Zl90OjpzZXQoY29uc3QgR0xmaXhlZCogcmhzKSB7CisgICAgbG9hZChyaHMpOworfQorCit2b2lkIG1hdHJpeGZfdDo6c2V0KGNvbnN0IEdMZmxvYXQqIHJocykgeworICAgIGxvYWQocmhzKTsKK30KKwordm9pZCBtYXRyaXhmX3Q6OmxvYWQoY29uc3QgR0xmaXhlZCogcmhzKSB7CisgICAgR0xmbG9hdCogZnAgPSBtOworICAgIHVuc2lnbmVkIGludCBpID0gMTY7CisgICAgZG8geworICAgICAgICAqZnArKyA9IGZpeGVkVG9GbG9hdCgqcmhzKyspOworICAgIH0gd2hpbGUgKC0taSk7Cit9CisKK3ZvaWQgbWF0cml4Zl90Ojpsb2FkKGNvbnN0IEdMZmxvYXQqIHJocykgeworICAgIG1lbWNweShtLCByaHMsIHNpemVvZihtKSk7Cit9CisKK3ZvaWQgbWF0cml4Zl90Ojpsb2FkKGNvbnN0IG1hdHJpeGZfdCYgcmhzKSB7CisgICAgb3BlcmF0b3IgPSAocmhzKTsKK30KKwordm9pZCBtYXRyaXhmX3Q6Om11bHRpcGx5KGNvbnN0IG1hdHJpeGZfdCYgcmhzKSB7CisgICAgbWF0cml4Zl90IHI7CisgICAgbXVsdGlwbHkociwgKnRoaXMsIHJocyk7CisgICAgb3BlcmF0b3IgPSAocik7Cit9CisKK3ZvaWQgbWF0cml4Zl90Ojp0cmFuc2xhdGUoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgeworICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICBtWzEyK2ldICs9IG1baV0qeCArIG1bNCtpXSp5ICsgbVs4K2ldKno7CisgICAgfQorfQorCit2b2lkIG1hdHJpeGZfdDo6c2NhbGUoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgeworICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICBtWyAgaV0gKj0geDsKKyAgICAgICAgbVs0K2ldICo9IHk7CisgICAgICAgIG1bOCtpXSAqPSB6OworICAgIH0KK30KKwordm9pZCBtYXRyaXhmX3Q6OnJvdGF0ZShHTGZsb2F0IGEsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCit7CisgICAgbWF0cml4Zl90IHJvdGF0aW9uOworICAgIEdMZmxvYXQqIHIgPSByb3RhdGlvbi5tOworICAgIEdMZmxvYXQgYywgczsKKyAgICByWzNdID0gMDsgICByWzddID0gMDsgICByWzExXT0gMDsKKyAgICByWzEyXT0gMDsgICByWzEzXT0gMDsgICByWzE0XT0gMDsgICByWzE1XT0gMTsKKyAgICBhICo9IEdMZmxvYXQoTV9QSSAvIDE4MC4wZik7CisgICAgc2luY29zZihhLCAmcywgJmMpOworICAgIGlmIChpc09uZWYoeCkgJiYgaXNaZXJvZih5KSAmJiBpc1plcm9mKHopKSB7CisgICAgICAgIHJbNV0gPSBjOyAgIHJbMTBdPSBjOworICAgICAgICByWzZdID0gczsgICByWzldID0gLXM7CisgICAgICAgIHJbMV0gPSAwOyAgIHJbMl0gPSAwOworICAgICAgICByWzRdID0gMDsgICByWzhdID0gMDsKKyAgICAgICAgclswXSA9IDE7CisgICAgfSBlbHNlIGlmIChpc1plcm9mKHgpICYmIGlzT25lZih5KSAmJiBpc1plcm9mKHopKSB7CisgICAgICAgIHJbMF0gPSBjOyAgIHJbMTBdPSBjOworICAgICAgICByWzhdID0gczsgICByWzJdID0gLXM7CisgICAgICAgIHJbMV0gPSAwOyAgIHJbNF0gPSAwOworICAgICAgICByWzZdID0gMDsgICByWzldID0gMDsKKyAgICAgICAgcls1XSA9IDE7CisgICAgfSBlbHNlIGlmIChpc1plcm9mKHgpICYmIGlzWmVyb2YoeSkgJiYgaXNPbmVmKHopKSB7CisgICAgICAgIHJbMF0gPSBjOyAgIHJbNV0gPSBjOworICAgICAgICByWzFdID0gczsgICByWzRdID0gLXM7CisgICAgICAgIHJbMl0gPSAwOyAgIHJbNl0gPSAwOworICAgICAgICByWzhdID0gMDsgICByWzldID0gMDsKKyAgICAgICAgclsxMF09IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgR0xmbG9hdCBsZW4gPSBzcXJ0Zih4KnggKyB5KnkgKyB6KnopOworICAgICAgICBpZiAoIWlzT25lZihsZW4pKSB7CisgICAgICAgICAgICBjb25zdCBHTGZsb2F0IHJlY2lwTGVuID0gcmVjaXByb2NhbGYobGVuKTsKKyAgICAgICAgICAgIHggKj0gcmVjaXBMZW47CisgICAgICAgICAgICB5ICo9IHJlY2lwTGVuOworICAgICAgICAgICAgeiAqPSByZWNpcExlbjsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBHTGZsb2F0IG5jID0gMS4wZiAtIGM7CisgICAgICAgIGNvbnN0IEdMZmxvYXQgeHkgPSB4ICogeTsKKyAgICAgICAgY29uc3QgR0xmbG9hdCB5eiA9IHkgKiB6OworICAgICAgICBjb25zdCBHTGZsb2F0IHp4ID0geiAqIHg7CisgICAgICAgIGNvbnN0IEdMZmxvYXQgeHMgPSB4ICogczsKKyAgICAgICAgY29uc3QgR0xmbG9hdCB5cyA9IHkgKiBzOworICAgICAgICBjb25zdCBHTGZsb2F0IHpzID0geiAqIHM7CQkKKyAgICAgICAgclsgMF0gPSB4KngqbmMgKyAgYzsgICAgclsgNF0gPSAgeHkqbmMgLSB6czsgICAgclsgOF0gPSAgengqbmMgKyB5czsKKyAgICAgICAgclsgMV0gPSAgeHkqbmMgKyB6czsgICAgclsgNV0gPSB5KnkqbmMgKyAgYzsgICAgclsgOV0gPSAgeXoqbmMgLSB4czsKKyAgICAgICAgclsgMl0gPSAgengqbmMgLSB5czsgICAgclsgNl0gPSAgeXoqbmMgKyB4czsgICAgclsxMF0gPSB6KnoqbmMgKyAgYzsKKyAgICB9CisgICAgbXVsdGlwbHkocm90YXRpb24pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBtYXRyaXhfc3RhY2tfdAorI2VuZGlmCisKK3ZvaWQgbWF0cml4X3N0YWNrX3Q6OmluaXQoaW50IGRlcHRoKSB7CisgICAgc3RhY2sgPSBuZXcgbWF0cml4Zl90W2RlcHRoXTsKKyAgICBvcHMgPSBuZXcgdWludDhfdFtkZXB0aF07CisgICAgbWF4RGVwdGggPSBkZXB0aDsKKyAgICBkZXB0aCA9IDA7CisgICAgZGlydHkgPSAwOworICAgIGxvYWRJZGVudGl0eSgpOworfQorCit2b2lkIG1hdHJpeF9zdGFja190Ojp1bmluaXQoKSB7CisgICAgZGVsZXRlIFtdIHN0YWNrOworICAgIGRlbGV0ZSBbXSBvcHM7Cit9CisKK3ZvaWQgbWF0cml4X3N0YWNrX3Q6OmxvYWRJZGVudGl0eSgpIHsKKyAgICB0cmFuc2Zvcm0ubG9hZElkZW50aXR5KCk7CisgICAgc3RhY2tbZGVwdGhdLmxvYWRJZGVudGl0eSgpOworICAgIG9wc1tkZXB0aF0gPSBPUF9JREVOVElUWTsKK30KKwordm9pZCBtYXRyaXhfc3RhY2tfdDo6bG9hZChjb25zdCBHTGZpeGVkKiByaHMpCit7ICAgCisgICAgbWVtY3B5KHRyYW5zZm9ybS5tYXRyaXgubSwgcmhzLCBzaXplb2YodHJhbnNmb3JtLm1hdHJpeC5tKSk7CisgICAgc3RhY2tbZGVwdGhdLmxvYWQocmhzKTsKKyAgICBvcHNbZGVwdGhdID0gT1BfQUxMOyAgICAvLyBUT0RPOiB3ZSBzaG91bGQgbG9vayBhdCB0aGUgbWF0cml4Cit9CisKK3ZvaWQgbWF0cml4X3N0YWNrX3Q6OmxvYWQoY29uc3QgR0xmbG9hdCogcmhzKQoreworICAgIHN0YWNrW2RlcHRoXS5sb2FkKHJocyk7CisgICAgb3BzW2RlcHRoXSA9IE9QX0FMTDsgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGxvb2sgYXQgdGhlIG1hdHJpeAorfQorCit2b2lkIG1hdHJpeF9zdGFja190OjptdWx0aXBseShjb25zdCBtYXRyaXhmX3QmIHJocykKK3sgICAgCisgICAgc3RhY2tbZGVwdGhdLm11bHRpcGx5KHJocyk7CisgICAgb3BzW2RlcHRoXSA9IE9QX0FMTDsgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGxvb2sgYXQgdGhlIG1hdHJpeAorfQorCit2b2lkIG1hdHJpeF9zdGFja190Ojp0cmFuc2xhdGUoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikKK3sKKyAgICBzdGFja1tkZXB0aF0udHJhbnNsYXRlKHgseSx6KTsKKyAgICBvcHNbZGVwdGhdIHw9IE9QX1RSQU5TTEFURTsKK30KKwordm9pZCBtYXRyaXhfc3RhY2tfdDo6c2NhbGUoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikKK3sKKyAgICBzdGFja1tkZXB0aF0uc2NhbGUoeCx5LHopOworICAgIGlmICh4PT15ICYmIHk9PXopIHsKKyAgICAgICAgb3BzW2RlcHRoXSB8PSBPUF9VTklGT1JNX1NDQUxFOworICAgIH0gZWxzZSB7CisgICAgICAgIG9wc1tkZXB0aF0gfD0gT1BfU0NBTEU7CisgICAgfQorfQorCit2b2lkIG1hdHJpeF9zdGFja190Ojpyb3RhdGUoR0xmbG9hdCBhLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQoreworICAgIHN0YWNrW2RlcHRoXS5yb3RhdGUoYSx4LHkseik7CisgICAgb3BzW2RlcHRoXSB8PSBPUF9ST1RBVEU7Cit9CisKK3ZvaWQgbWF0cml4X3N0YWNrX3Q6OnZhbGlkYXRlKCkKK3sKKyAgICBpZiAoZGlydHkgJiBET19GTE9BVF9UT19GSVhFRCkgeworICAgICAgICB0cmFuc2Zvcm0ubWF0cml4LmxvYWQodG9wKCkpOworICAgIH0KKyAgICBpZiAoZGlydHkgJiBET19QSUNLRVIpIHsKKyAgICAgICAgdHJhbnNmb3JtLnBpY2tlcigpOworICAgIH0KKyAgICBkaXJ0eSA9IDA7Cit9CisKK0dMaW50IG1hdHJpeF9zdGFja190OjpwdXNoKCkKK3sKKyAgICBpZiAoZGVwdGggPj0gKG1heERlcHRoLTEpKSB7CisgICAgICAgIHJldHVybiBHTF9TVEFDS19PVkVSRkxPVzsKKyAgICB9CisgICAgc3RhY2tbZGVwdGgrMV0gPSBzdGFja1tkZXB0aF07CisgICAgb3BzW2RlcHRoKzFdID0gb3BzW2RlcHRoXTsKKyAgICBkZXB0aCsrOworICAgIHJldHVybiAwOworfQorCitHTGludCBtYXRyaXhfc3RhY2tfdDo6cG9wKCkKK3sKKyAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICByZXR1cm4gR0xfU1RBQ0tfVU5ERVJGTE9XOworICAgIH0KKyAgICBkZXB0aC0tOworICAgIHJldHVybiAwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayB2cF90cmFuc2Zvcm1fdAorI2VuZGlmCisKK3ZvaWQgdnBfdHJhbnNmb3JtX3Q6OmxvYWRJZGVudGl0eSgpIHsKKyAgICB0cmFuc2Zvcm0ubG9hZElkZW50aXR5KCk7CisgICAgbWF0cml4LmxvYWRJZGVudGl0eSgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgMAorI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayB0cmFuc2Zvcm1fc3RhdGVfdAorI2VuZGlmCisKK3ZvaWQgdHJhbnNmb3JtX3N0YXRlX3Q6OmludmFsaWRhdGUoKQoreworICAgIHN3aXRjaCAobWF0cml4TW9kZSkgeworICAgIGNhc2UgR0xfTU9ERUxWSUVXOiAgZGlydHkgfD0gTU9ERUxWSUVXICB8IE1WUCB8IE1WVUkgfCBNVklUOyAgICBicmVhazsKKyAgICBjYXNlIEdMX1BST0pFQ1RJT046IGRpcnR5IHw9IFBST0pFQ1RJT04gfCBNVlA7ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9URVhUVVJFOiAgICBkaXJ0eSB8PSBURVhUVVJFICAgIHwgTVZQOyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjdXJyZW50LT5kaXJ0eSA9ICAgIG1hdHJpeF9zdGFja190OjpET19QSUNLRVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4X3N0YWNrX3Q6OkRPX0ZMT0FUX1RPX0ZJWEVEOworfQorCit2b2lkIHRyYW5zZm9ybV9zdGF0ZV90Ojp1cGRhdGVfbXZwKCkKK3sKKyAgICBtYXRyaXhmX3QgdGVtcF9tdnA7CisgICAgbWF0cml4Zl90OjptdWx0aXBseSh0ZW1wX212cCwgcHJvamVjdGlvbi50b3AoKSwgbW9kZWx2aWV3LnRvcCgpKTsKKyAgICBtdnA0Lm1hdHJpeC5sb2FkKHRlbXBfbXZwKTsKKyAgICBtdnA0LnBpY2tlcigpOworCisgICAgaWYgKG12cDQuZmxhZ3MgJiB0cmFuc2Zvcm1fdDo6RkxBR1NfMkRfUFJPSkVDVElPTikgeworICAgICAgICAvLyB0aGUgbXZwIG1hdHJpeCBkb2Vzbid0IHRyYW5zZm9ybSBXLCBpbiB0aGlzIGNhc2Ugd2UgY2FuCisgICAgICAgIC8vIHByZW11bHRpcGx5IGl0IHdpdGggdGhlIHZpZXdwb3J0IHRyYW5zZm9ybWF0aW9uLiBJbiBhZGRpdGlvbiB0bworICAgICAgICAvLyBiZWluZyBtb3JlIGVmZmljaWVudCwgdGhpcyBpcyBhbHNvIG11Y2ggbW9yZSBhY2N1cmF0ZSBhbmQgaW4gZmFjdAorICAgICAgICAvLyBpcyBuZWVkZWQgZm9yIDJEIGRyYXdpbmcgd2l0aCBhIHJlc3VsdGluZyAxOjEgbWFwcGluZy4KKyAgICAgICAgbWF0cml4Zl90IG12cHY7CisgICAgICAgIG1hdHJpeGZfdDo6bXVsdGlwbHkobXZwdiwgdnB0Lm1hdHJpeCwgdGVtcF9tdnApOworICAgICAgICBtdnAubWF0cml4LmxvYWQobXZwdik7CisgICAgICAgIG12cC5waWNrZXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtdnAgPSBtdnA0OworICAgIH0KK30KKworc3RhdGljIGlubGluZSAKK0dMZmxvYXQgZGV0MjIoR0xmbG9hdCBhLCBHTGZsb2F0IGIsIEdMZmxvYXQgYywgR0xmbG9hdCBkKSB7CisgICAgcmV0dXJuIGEqZCAtIGIqYzsKK30KKworc3RhdGljIGlubGluZQorR0xmbG9hdCBuZGV0MjIoR0xmbG9hdCBhLCBHTGZsb2F0IGIsIEdMZmxvYXQgYywgR0xmbG9hdCBkKSB7CisgICAgcmV0dXJuIGIqYyAtIGEqZDsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK3ZvaWQgaW52ZXJ0KEdMZmxvYXQqIGludmVyc2UsIGNvbnN0IEdMZmxvYXQqIHNyYykKK3sKKyAgICBkb3VibGUgdDsKKyAgICBpbnQgaSwgaiwgaywgc3dhcDsKKyAgICBHTGZsb2F0IHRtcFs0XVs0XTsKKyAgICAKKyAgICBtZW1jcHkoaW52ZXJzZSwgZ0lkZW50aXR5Ziwgc2l6ZW9mKGdJZGVudGl0eWYpKTsKKyAgICBtZW1jcHkodG1wLCBzcmMsIHNpemVvZihHTGZsb2F0KSoxNik7CisgICAgCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAvLyBsb29rIGZvciBsYXJnZXN0IGVsZW1lbnQgaW4gY29sdW1uCisgICAgICAgIHN3YXAgPSBpOworICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgaWYgKGZhYnModG1wW2pdW2ldKSA+IGZhYnModG1wW2ldW2ldKSkgeworICAgICAgICAgICAgICAgIHN3YXAgPSBqOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoc3dhcCAhPSBpKSB7CisgICAgICAgICAgICAvKiBzd2FwIHJvd3MuICovCisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICAgICAgdCA9IHRtcFtpXVtrXTsKKyAgICAgICAgICAgICAgICB0bXBbaV1ba10gPSB0bXBbc3dhcF1ba107CisgICAgICAgICAgICAgICAgdG1wW3N3YXBdW2tdID0gdDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0ID0gaW52ZXJzZVtpKjQra107CisgICAgICAgICAgICAgICAgaW52ZXJzZVtpKjQra10gPSBpbnZlcnNlW3N3YXAqNCtrXTsKKyAgICAgICAgICAgICAgICBpbnZlcnNlW3N3YXAqNCtrXSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHQgPSAxLjBmIC8gdG1wW2ldW2ldOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICB0bXBbaV1ba10gKj0gdDsKKyAgICAgICAgICAgIGludmVyc2VbaSo0K2tdICo9IHQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgaWYgKGogIT0gaSkgeworICAgICAgICAgICAgICAgIHQgPSB0bXBbal1baV07CisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgeworICAgICAgICAgICAgICAgICAgICB0bXBbal1ba10gLT0gdG1wW2ldW2tdKnQ7CisgICAgICAgICAgICAgICAgICAgIGludmVyc2Vbaio0K2tdIC09IGludmVyc2VbaSo0K2tdKnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHRyYW5zZm9ybV9zdGF0ZV90Ojp1cGRhdGVfbXZpdCgpCit7CisgICAgR0xmbG9hdCByWzE2XTsKKyAgICBjb25zdCBHTGZsb2F0KiBjb25zdCBtdiA9IG1vZGVsdmlldy50b3AoKS5lbGVtZW50cygpOworICAgIGludmVydChyLCBtdik7CisgICAgLy8gY29udmVydCB0byBmaXhlZC1wb2ludCBhbmQgdHJhbnNwb3NlCisgICAgR0xmaXhlZCogY29uc3QgeCA9IG12aXQ0Lm1hdHJpeC5tOworICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykKKyAgICAgICAgZm9yIChpbnQgaj0wIDsgajw0IDsgaisrKQorICAgICAgICAgICAgeFtJKGksaildID0gZ2dsRmxvYXRUb0ZpeGVkKHJbSShqLGkpXSk7CisgICAgbXZpdDQucGlja2VyKCk7Cit9CisKK3ZvaWQgdHJhbnNmb3JtX3N0YXRlX3Q6OnVwZGF0ZV9tdnVpKCkKK3sKKyAgICBjb25zdCBHTGZsb2F0KiBjb25zdCBtdiA9IG1vZGVsdmlldy50b3AoKS5lbGVtZW50cygpOworCisgICAgLyoKKyAgICBXaGVuIHRyYW5zZm9ybWluZyBub3JtYWxzLCB3ZSBjYW4gdXNlIHRoZSB1cHBlciAzeDMgbWF0cml4LCBzZWU6CisgICAgaHR0cDovL3d3dy5vcGVuZ2wub3JnL2RvY3VtZW50YXRpb24vc3BlY3MvdmVyc2lvbjEuMS9nbHNwZWMxLjEvbm9kZTI2Lmh0bWwKKyAgICAqLworICAgIAorICAgIC8vIEFsc28gbm90ZSB0aGF0OgorICAgIC8vICAgICAgbChvYmopID0gIHRyKE0pLmwoZXllKSBmb3IgaW5maW5pdGUgbGlnaHQKKyAgICAvLyAgICAgIGwob2JqKSA9IGludihNKS5sKGV5ZSkgZm9yIGxvY2FsIGxpZ2h0CisKKyAgICBjb25zdCB1aW50MzJfdCBvcHMgPSBtb2RlbHZpZXcudG9wX29wcygpICYgfk9QX1RSQU5TTEFURTsKKyAgICBpZiAoZ2dsX2xpa2VseSgoIShvcHMgJiB+T1BfUk9UQVRFKSkgfHwKKyAgICAgICAgKHJlc2NhbGVOb3JtYWxzICYmIG1vZGVsdmlldy5pc1JpZ2lkQm9keSgpKSkpIHsKKyAgICAgICAgLy8gaWYgdGhlIG1vZGVsdmlldyBtYXRyaXggaXMgYSByaWdpZCBib2R5IHRyYW5zZm9ybWF0aW9uCisgICAgICAgIC8vICh0cmFuc2xhdGlvbiwgcm90YXRpb24sIHVuaWZvcm0gc2NhbGluZyksIHRoZW4gd2UgY2FuIGJ5cGFzcworICAgICAgICAvLyB0aGUgaW52ZXJzZSBieSB0cmFuc3Bvc2luZyB0aGUgbWF0cml4LgorICAgICAgICBHTGZsb2F0IHJlc2NhbGUgPSAxLjBmOworICAgICAgICBpZiAocmVzY2FsZU5vcm1hbHMgPT0gR0xfUkVTQ0FMRV9OT1JNQUwpIHsKKyAgICAgICAgICAgIGlmICghKG9wcyAmIH5PUF9VTklGT1JNX1NDQUxFKSkgeworICAgICAgICAgICAgICAgIHJlc2NhbGUgPSByZWNpcHJvY2FsZihtdltJKDAsMCldKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzY2FsZSA9IHJzcXJ0ZigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNxcmYobXZbSSgyLDApXSkgKyBzcXJmKG12W0koMiwxKV0pICsgc3FyZihtdltJKDIsMildKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgR0xmaXhlZCogY29uc3QgeCA9IG12dWkubWF0cml4Lm07CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8MyA7IGkrKykgeworICAgICAgICAgICAgeFtJKGksMCldID0gZ2dsRmxvYXRUb0ZpeGVkKG12W0koMCxpKV0gKiByZXNjYWxlKTsKKyAgICAgICAgICAgIHhbSShpLDEpXSA9IGdnbEZsb2F0VG9GaXhlZChtdltJKDEsaSldICogcmVzY2FsZSk7CisgICAgICAgICAgICB4W0koaSwyKV0gPSBnZ2xGbG9hdFRvRml4ZWQobXZbSSgyLGkpXSAqIHJlc2NhbGUpOworICAgICAgICB9CisgICAgICAgIG12dWkucGlja2VyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBHTGZsb2F0IHJbM11bM107CisgICAgclswXVswXSA9IGRldDIyKG12W0koMSwxKV0sIG12W0koMiwxKV0sIG12W0koMSwyKV0sIG12W0koMiwyKV0pOworICAgIHJbMF1bMV0gPW5kZXQyMihtdltJKDAsMSldLCBtdltJKDIsMSldLCBtdltJKDAsMildLCBtdltJKDIsMildKTsKKyAgICByWzBdWzJdID0gZGV0MjIobXZbSSgwLDEpXSwgbXZbSSgxLDEpXSwgbXZbSSgwLDIpXSwgbXZbSSgxLDIpXSk7CisgICAgclsxXVswXSA9bmRldDIyKG12W0koMSwwKV0sIG12W0koMiwwKV0sIG12W0koMSwyKV0sIG12W0koMiwyKV0pOworICAgIHJbMV1bMV0gPSBkZXQyMihtdltJKDAsMCldLCBtdltJKDIsMCldLCBtdltJKDAsMildLCBtdltJKDIsMildKTsKKyAgICByWzFdWzJdID1uZGV0MjIobXZbSSgwLDApXSwgbXZbSSgxLDApXSwgbXZbSSgwLDIpXSwgbXZbSSgxLDIpXSk7CisgICAgclsyXVswXSA9IGRldDIyKG12W0koMSwwKV0sIG12W0koMiwwKV0sIG12W0koMSwxKV0sIG12W0koMiwxKV0pOworICAgIHJbMl1bMV0gPW5kZXQyMihtdltJKDAsMCldLCBtdltJKDIsMCldLCBtdltJKDAsMSldLCBtdltJKDIsMSldKTsKKyAgICByWzJdWzJdID0gZGV0MjIobXZbSSgwLDApXSwgbXZbSSgxLDApXSwgbXZbSSgwLDEpXSwgbXZbSSgxLDEpXSk7ICAgICAgICAKKworICAgIEdMZmxvYXQgcmRldDsKKyAgICBpZiAocmVzY2FsZU5vcm1hbHMgPT0gR0xfUkVTQ0FMRV9OT1JNQUwpIHsKKyAgICAgICAgcmRldCA9IHJzcXJ0ZihzcXJmKHJbMF1bMl0pICsgc3FyZihyWzFdWzJdKSArIHNxcmYoclsyXVsyXSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJkZXQgPSByZWNpcHJvY2FsZiggCisgICAgICAgICAgICByWzBdWzBdKm12W0koMCwwKV0gKyByWzBdWzFdKm12W0koMSwwKV0gKyByWzBdWzJdKm12W0koMiwwKV0pOworICAgIH0KKworICAgIEdMZml4ZWQqIGNvbnN0IHggPSBtdnVpLm1hdHJpeC5tOworICAgIGZvciAoaW50IGk9MCA7IGk8MyA7IGkrKykgeworICAgICAgICB4W0koaSwwKV0gPSBnZ2xGbG9hdFRvRml4ZWQocltpXVswXSAqIHJkZXQpOworICAgICAgICB4W0koaSwxKV0gPSBnZ2xGbG9hdFRvRml4ZWQocltpXVsxXSAqIHJkZXQpOworICAgICAgICB4W0koaSwyKV0gPSBnZ2xGbG9hdFRvRml4ZWQocltpXVsyXSAqIHJkZXQpOworICAgIH0KKyAgICBtdnVpLnBpY2tlcigpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRyYW5zZm9ybWF0aW9uIGFuZCBtYXRyaWNlcyBBUEkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAwCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIHRyYW5zZm9ybWF0aW9uIGFuZCBtYXRyaWNlcyBBUEkKKyNlbmRpZgorCitpbnQgb2dsZXNfc3VyZmFjZXBvcnQob2dsZXNfY29udGV4dF90KiBjLCBHTGludCB4LCBHTGludCB5KQoreworICAgIGMtPnZpZXdwb3J0LnN1cmZhY2Vwb3J0LnggPSB4OworICAgIGMtPnZpZXdwb3J0LnN1cmZhY2Vwb3J0LnkgPSB5OworCisgICAgb2dsZXNfdmlld3BvcnQoYywgCisgICAgICAgICAgICBjLT52aWV3cG9ydC54LAorICAgICAgICAgICAgYy0+dmlld3BvcnQueSwKKyAgICAgICAgICAgIGMtPnZpZXdwb3J0LncsCisgICAgICAgICAgICBjLT52aWV3cG9ydC5oKTsKKworICAgIG9nbGVzX3NjaXNzb3IoYywKKyAgICAgICAgICAgIGMtPnZpZXdwb3J0LnNjaXNzb3IueCwKKyAgICAgICAgICAgIGMtPnZpZXdwb3J0LnNjaXNzb3IueSwKKyAgICAgICAgICAgIGMtPnZpZXdwb3J0LnNjaXNzb3IudywKKyAgICAgICAgICAgIGMtPnZpZXdwb3J0LnNjaXNzb3IuaCk7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBvZ2xlc19zY2lzc29yKG9nbGVzX2NvbnRleHRfdCogYywgCisgICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgdywgR0xzaXplaSBoKQoreworICAgIGlmICgod3xoKSA8IDApIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+dmlld3BvcnQuc2Npc3Nvci54ID0geDsKKyAgICBjLT52aWV3cG9ydC5zY2lzc29yLnkgPSB5OworICAgIGMtPnZpZXdwb3J0LnNjaXNzb3IudyA9IHc7CisgICAgYy0+dmlld3BvcnQuc2Npc3Nvci5oID0gaDsKKyAgICAKKyAgICB4ICs9IGMtPnZpZXdwb3J0LnN1cmZhY2Vwb3J0Lng7CisgICAgeSArPSBjLT52aWV3cG9ydC5zdXJmYWNlcG9ydC55OworCisgICAgeSA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5jb2xvci5oZWlnaHQgLSAoeSArIGgpOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3Muc2Npc3NvcihjLCB4LCB5LCB3LCBoKTsKK30KKwordm9pZCBvZ2xlc192aWV3cG9ydChvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgdywgR0xzaXplaSBoKQoreworICAgIGlmICgod3xoKTwwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYy0+dmlld3BvcnQueCA9IHg7CisgICAgYy0+dmlld3BvcnQueSA9IHk7CisgICAgYy0+dmlld3BvcnQudyA9IHc7CisgICAgYy0+dmlld3BvcnQuaCA9IGg7CisKKyAgICB4ICs9IGMtPnZpZXdwb3J0LnN1cmZhY2Vwb3J0Lng7CisgICAgeSArPSBjLT52aWV3cG9ydC5zdXJmYWNlcG9ydC55OworCisgICAgR0xpbnQgSCA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5jb2xvci5oZWlnaHQ7CisgICAgR0xmbG9hdCBzeCA9IGRpdjJmKHcpOworICAgIEdMZmxvYXQgb3ggPSBzeCArIHg7CisgICAgR0xmbG9hdCBzeSA9IGRpdjJmKGgpOworICAgIEdMZmxvYXQgb3kgPSBzeSAtIHkgKyAoSCAtIGgpOworCisgICAgR0xmbG9hdCBuZWFyID0gYy0+dHJhbnNmb3Jtcy52cHQuek5lYXI7CisgICAgR0xmbG9hdCBmYXIgID0gYy0+dHJhbnNmb3Jtcy52cHQuekZhcjsKKyAgICBHTGZsb2F0IEEgPSBkaXYyZihmYXIgLSBuZWFyKTsKKyAgICBHTGZsb2F0IEIgPSBkaXYyZihmYXIgKyBuZWFyKTsKKworICAgIC8vIGNvbXB1dGUgdmlld3BvcnQgbWF0cml4CisgICAgR0xmbG9hdCogY29uc3QgZiA9IGMtPnRyYW5zZm9ybXMudnB0Lm1hdHJpeC5lZGl0RWxlbWVudHMoKTsKKyAgICBmWzBdID0gc3g7ICBmWzRdID0gMDsgICBmWyA4XSA9IDA7ICBmWzEyXSA9IG94OworICAgIGZbMV0gPSAwOyAgIGZbNV0gPS1zeTsgIGZbIDldID0gMDsgIGZbMTNdID0gb3k7CisgICAgZlsyXSA9IDA7ICAgZls2XSA9IDA7ICAgZlsxMF0gPSBBOyAgZlsxNF0gPSBCOworICAgIGZbM10gPSAwOyAgIGZbN10gPSAwOyAgIGZbMTFdID0gMDsgIGZbMTVdID0gMTsKKyAgICBjLT50cmFuc2Zvcm1zLmRpcnR5IHw9IHRyYW5zZm9ybV9zdGF0ZV90OjpWSUVXUE9SVDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgbWF0cml4ICogdmVydGV4CisjZW5kaWYKKwordm9pZCBwb2ludDJfX2dlbmVyaWModHJhbnNmb3JtX3QgY29uc3QqIG14LCB2ZWM0X3QqIGxocywgdmVjNF90IGNvbnN0KiByaHMpIHsKKyAgICBjb25zdCBHTGZpeGVkKiBjb25zdCBtID0gbXgtPm1hdHJpeC5tOworICAgIGNvbnN0IEdMZml4ZWQgcnggPSByaHMtPng7CisgICAgY29uc3QgR0xmaXhlZCByeSA9IHJocy0+eTsKKyAgICBsaHMtPnggPSBtbGEyYShyeCwgbVsgMF0sIHJ5LCBtWyA0XSwgbVsxMl0pOyAKKyAgICBsaHMtPnkgPSBtbGEyYShyeCwgbVsgMV0sIHJ5LCBtWyA1XSwgbVsxM10pOworICAgIGxocy0+eiA9IG1sYTJhKHJ4LCBtWyAyXSwgcnksIG1bIDZdLCBtWzE0XSk7CisgICAgbGhzLT53ID0gbWxhMmEocngsIG1bIDNdLCByeSwgbVsgN10sIG1bMTVdKTsKK30KKwordm9pZCBwb2ludDNfX2dlbmVyaWModHJhbnNmb3JtX3QgY29uc3QqIG14LCB2ZWM0X3QqIGxocywgdmVjNF90IGNvbnN0KiByaHMpIHsKKyAgICBjb25zdCBHTGZpeGVkKiBjb25zdCBtID0gbXgtPm1hdHJpeC5tOworICAgIGNvbnN0IEdMZml4ZWQgcnggPSByaHMtPng7CisgICAgY29uc3QgR0xmaXhlZCByeSA9IHJocy0+eTsKKyAgICBjb25zdCBHTGZpeGVkIHJ6ID0gcmhzLT56OworICAgIGxocy0+eCA9IG1sYTNhKHJ4LCBtWyAwXSwgcnksIG1bIDRdLCByeiwgbVsgOF0sIG1bMTJdKTsgCisgICAgbGhzLT55ID0gbWxhM2EocngsIG1bIDFdLCByeSwgbVsgNV0sIHJ6LCBtWyA5XSwgbVsxM10pOworICAgIGxocy0+eiA9IG1sYTNhKHJ4LCBtWyAyXSwgcnksIG1bIDZdLCByeiwgbVsxMF0sIG1bMTRdKTsKKyAgICBsaHMtPncgPSBtbGEzYShyeCwgbVsgM10sIHJ5LCBtWyA3XSwgcnosIG1bMTFdLCBtWzE1XSk7Cit9CisKK3ZvaWQgcG9pbnQ0X19nZW5lcmljKHRyYW5zZm9ybV90IGNvbnN0KiBteCwgdmVjNF90KiBsaHMsIHZlYzRfdCBjb25zdCogcmhzKSB7CisgICAgY29uc3QgR0xmaXhlZCogY29uc3QgbSA9IG14LT5tYXRyaXgubTsKKyAgICBjb25zdCBHTGZpeGVkIHJ4ID0gcmhzLT54OworICAgIGNvbnN0IEdMZml4ZWQgcnkgPSByaHMtPnk7CisgICAgY29uc3QgR0xmaXhlZCByeiA9IHJocy0+ejsKKyAgICBjb25zdCBHTGZpeGVkIHJ3ID0gcmhzLT53OworICAgIGxocy0+eCA9IG1sYTQocngsIG1bIDBdLCByeSwgbVsgNF0sIHJ6LCBtWyA4XSwgcncsIG1bMTJdKTsgCisgICAgbGhzLT55ID0gbWxhNChyeCwgbVsgMV0sIHJ5LCBtWyA1XSwgcnosIG1bIDldLCBydywgbVsxM10pOworICAgIGxocy0+eiA9IG1sYTQocngsIG1bIDJdLCByeSwgbVsgNl0sIHJ6LCBtWzEwXSwgcncsIG1bMTRdKTsKKyAgICBsaHMtPncgPSBtbGE0KHJ4LCBtWyAzXSwgcnksIG1bIDddLCByeiwgbVsxMV0sIHJ3LCBtWzE1XSk7Cit9CisKK3ZvaWQgbm9ybWFsX19nZW5lcmljKHRyYW5zZm9ybV90IGNvbnN0KiBteCwgdmVjNF90KiBsaHMsIHZlYzRfdCBjb25zdCogcmhzKSB7CisgICAgY29uc3QgR0xmaXhlZCogY29uc3QgbSA9IG14LT5tYXRyaXgubTsKKyAgICBjb25zdCBHTGZpeGVkIHJ4ID0gcmhzLT54OworICAgIGNvbnN0IEdMZml4ZWQgcnkgPSByaHMtPnk7CisgICAgY29uc3QgR0xmaXhlZCByeiA9IHJocy0+ejsKKyAgICBsaHMtPnggPSBtbGEzKHJ4LCBtWyAwXSwgcnksIG1bIDRdLCByeiwgbVsgOF0pOyAKKyAgICBsaHMtPnkgPSBtbGEzKHJ4LCBtWyAxXSwgcnksIG1bIDVdLCByeiwgbVsgOV0pOworICAgIGxocy0+eiA9IG1sYTMocngsIG1bIDJdLCByeSwgbVsgNl0sIHJ6LCBtWzEwXSk7Cit9CisKKwordm9pZCBwb2ludDJfX25vcCh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCogbGhzLCB2ZWM0X3QgY29uc3QqIHJocykgeworICAgIGxocy0+eiA9IDA7CisgICAgbGhzLT53ID0gMHgxMDAwMDsKKyAgICBpZiAobGhzICE9IHJocykgeworICAgICAgICBsaHMtPnggPSByaHMtPng7CisgICAgICAgIGxocy0+eSA9IHJocy0+eTsKKyAgICB9Cit9CisKK3ZvaWQgcG9pbnQzX19ub3AodHJhbnNmb3JtX3QgY29uc3QqLCB2ZWM0X3QqIGxocywgdmVjNF90IGNvbnN0KiByaHMpIHsKKyAgICBsaHMtPncgPSAweDEwMDAwOworICAgIGlmIChsaHMgIT0gcmhzKSB7CisgICAgICAgIGxocy0+eCA9IHJocy0+eDsKKyAgICAgICAgbGhzLT55ID0gcmhzLT55OworICAgICAgICBsaHMtPnogPSByaHMtPno7CisgICAgfQorfQorCit2b2lkIHBvaW50NF9fbm9wKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBsaHMsIHZlYzRfdCBjb25zdCogcmhzKSB7CisgICAgaWYgKGxocyAhPSByaHMpCisgICAgICAgICpsaHMgPSAqcmhzOworfQorCisKK3N0YXRpYyB2b2lkIGZydXN0dW1mKAorICAgICAgICAgICAgR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCAKKyAgICAgICAgICAgIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwKKyAgICAgICAgICAgIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciwKKyAgICAgICAgICAgIG9nbGVzX2NvbnRleHRfdCogYykKKyAgICB7CisgICAgaWYgKGNtcGYobGVmdCxyaWdodCkgfHwKKyAgICAgICAgY21wZih0b3AsIGJvdHRvbSkgfHwKKyAgICAgICAgY21wZih6TmVhciwgekZhcikgfHwKKyAgICAgICAgaXNaZXJvT3JOZWdhdGl2ZWYoek5lYXIpIHx8CisgICAgICAgIGlzWmVyb09yTmVnYXRpdmVmKHpGYXIpKQorICAgIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgR0xmbG9hdCByX3dpZHRoICA9IHJlY2lwcm9jYWxmKHJpZ2h0IC0gbGVmdCk7CisgICAgY29uc3QgR0xmbG9hdCByX2hlaWdodCA9IHJlY2lwcm9jYWxmKHRvcCAtIGJvdHRvbSk7CisgICAgY29uc3QgR0xmbG9hdCByX2RlcHRoICA9IHJlY2lwcm9jYWxmKHpOZWFyIC0gekZhcik7CisgICAgY29uc3QgR0xmbG9hdCB4ID0gbXVsMmYoek5lYXIgKiByX3dpZHRoKTsKKyAgICBjb25zdCBHTGZsb2F0IHkgPSBtdWwyZih6TmVhciAqIHJfaGVpZ2h0KTsKKyAgICBjb25zdCBHTGZsb2F0IEEgPSBtdWwyZigocmlnaHQgKyBsZWZ0KSAqIHJfd2lkdGgpOworICAgIGNvbnN0IEdMZmxvYXQgQiA9ICh0b3AgKyBib3R0b20pICogcl9oZWlnaHQ7CisgICAgY29uc3QgR0xmbG9hdCBDID0gKHpGYXIgKyB6TmVhcikgKiByX2RlcHRoOworICAgIGNvbnN0IEdMZmxvYXQgRCA9IG11bDJmKHpGYXIgKiB6TmVhciAqIHJfZGVwdGgpOworICAgIEdMZmxvYXQgZlsxNl07CisgICAgZlsgMF0gPSB4OworICAgIGZbIDVdID0geTsKKyAgICBmWyA4XSA9IEE7CisgICAgZlsgOV0gPSBCOworICAgIGZbMTBdID0gQzsKKyAgICBmWzE0XSA9IEQ7CisgICAgZlsxMV0gPSAtMS4wZjsKKyAgICBmWyAxXSA9IGZbIDJdID0gZlsgM10gPQorICAgIGZbIDRdID0gZlsgNl0gPSBmWyA3XSA9CisgICAgZlsxMl0gPSBmWzEzXSA9IGZbMTVdID0gMC4wZjsKKworICAgIG1hdHJpeGZfdCByaHM7CisgICAgcmhzLnNldChmKTsKKyAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPm11bHRpcGx5KHJocyk7CisgICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Cit9CisKK3N0YXRpYyB2b2lkIG9ydGhvZiggCisgICAgICAgIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgCisgICAgICAgIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwKKyAgICAgICAgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyLAorICAgICAgICBvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgaWYgKGNtcGYobGVmdCxyaWdodCkgfHwKKyAgICAgICAgY21wZih0b3AsIGJvdHRvbSkgfHwKKyAgICAgICAgY21wZih6TmVhciwgekZhcikpCisgICAgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBHTGZsb2F0IHJfd2lkdGggID0gcmVjaXByb2NhbGYocmlnaHQgLSBsZWZ0KTsKKyAgICBjb25zdCBHTGZsb2F0IHJfaGVpZ2h0ID0gcmVjaXByb2NhbGYodG9wIC0gYm90dG9tKTsKKyAgICBjb25zdCBHTGZsb2F0IHJfZGVwdGggID0gcmVjaXByb2NhbGYoekZhciAtIHpOZWFyKTsKKyAgICBjb25zdCBHTGZsb2F0IHggPSAgbXVsMmYocl93aWR0aCk7CisgICAgY29uc3QgR0xmbG9hdCB5ID0gIG11bDJmKHJfaGVpZ2h0KTsKKyAgICBjb25zdCBHTGZsb2F0IHogPSAtbXVsMmYocl9kZXB0aCk7CisgICAgY29uc3QgR0xmbG9hdCB0eCA9IC0ocmlnaHQgKyBsZWZ0KSAqIHJfd2lkdGg7CisgICAgY29uc3QgR0xmbG9hdCB0eSA9IC0odG9wICsgYm90dG9tKSAqIHJfaGVpZ2h0OworICAgIGNvbnN0IEdMZmxvYXQgdHogPSAtKHpGYXIgKyB6TmVhcikgKiByX2RlcHRoOworICAgIEdMZmxvYXQgZlsxNl07CisgICAgZlsgMF0gPSB4OworICAgIGZbIDVdID0geTsKKyAgICBmWzEwXSA9IHo7CisgICAgZlsxMl0gPSB0eDsKKyAgICBmWzEzXSA9IHR5OworICAgIGZbMTRdID0gdHo7CisgICAgZlsxNV0gPSAxLjBmOworICAgIGZbIDFdID0gZlsgMl0gPSBmWyAzXSA9CisgICAgZlsgNF0gPSBmWyA2XSA9IGZbIDddID0KKyAgICBmWyA4XSA9IGZbIDldID0gZlsxMV0gPSAwLjBmOworICAgIG1hdHJpeGZfdCByaHM7CisgICAgcmhzLnNldChmKTsKKyAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPm11bHRpcGx5KHJocyk7CisgICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGRlcHRoUmFuZ2VmKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyLCBvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgek5lYXIgPSBjbGFtcFRvWmVyb2Yoek5lYXIgPiAxID8gMSA6IHpOZWFyKTsKKyAgICB6RmFyICA9IGNsYW1wVG9aZXJvZih6RmFyICA+IDEgPyAxIDogekZhcik7CisgICAgR0xmbG9hdCogY29uc3QgZiA9IGMtPnRyYW5zZm9ybXMudnB0Lm1hdHJpeC5lZGl0RWxlbWVudHMoKTsKKyAgICBmWzEwXSA9IGRpdjJmKHpGYXIgLSB6TmVhcik7CisgICAgZlsxNF0gPSBkaXYyZih6RmFyICsgek5lYXIpOworICAgIGMtPnRyYW5zZm9ybXMuZGlydHkgfD0gdHJhbnNmb3JtX3N0YXRlX3Q6OlZJRVdQT1JUOworICAgIGMtPnRyYW5zZm9ybXMudnB0LnpOZWFyID0gek5lYXI7CisgICAgYy0+dHJhbnNmb3Jtcy52cHQuekZhciAgPSB6RmFyOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCit2b2lkIGdsTWF0cml4TW9kZShHTGVudW0gbW9kZSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIG1hdHJpeF9zdGFja190KiBzdGFjayA9IDA7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBHTF9NT0RFTFZJRVc6CisgICAgICAgIHN0YWNrID0gJmMtPnRyYW5zZm9ybXMubW9kZWx2aWV3OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1BST0pFQ1RJT046CisgICAgICAgIHN0YWNrID0gJmMtPnRyYW5zZm9ybXMucHJvamVjdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9URVhUVVJFOgorICAgICAgICBzdGFjayA9ICZjLT50cmFuc2Zvcm1zLnRleHR1cmVbYy0+dGV4dHVyZXMuYWN0aXZlXTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjLT50cmFuc2Zvcm1zLm1hdHJpeE1vZGUgPSBtb2RlOworICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudCA9IHN0YWNrOworfQorCit2b2lkIGdsTG9hZElkZW50aXR5KCkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+bG9hZElkZW50aXR5KCk7IC8vIGFsc28gbG9hZHMgdGhlIEdMZml4ZWQgdHJhbnNmb3JtCisgICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7CisgICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5kaXJ0eSA9IDA7Cit9CisKK3ZvaWQgZ2xMb2FkTWF0cml4Zihjb25zdCBHTGZsb2F0KiBtKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5sb2FkKG0pOworICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOworfQorCit2b2lkIGdsTG9hZE1hdHJpeHgoY29uc3QgR0xmaXhlZCogbSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+bG9hZChtKTsgLy8gYWxzbyBsb2FkcyB0aGUgR0xmaXhlZCB0cmFuc2Zvcm0KKyAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKKyAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPmRpcnR5ICY9IH5tYXRyaXhfc3RhY2tfdDo6RE9fRkxPQVRfVE9fRklYRUQ7Cit9CisKK3ZvaWQgZ2xNdWx0TWF0cml4Zihjb25zdCBHTGZsb2F0KiBtKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgbWF0cml4Zl90IHJoczsKKyAgICByaHMuc2V0KG0pOworICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+bXVsdGlwbHkocmhzKTsKKyAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKK30KKwordm9pZCBnbE11bHRNYXRyaXh4KGNvbnN0IEdMZml4ZWQqIG0pCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBtYXRyaXhmX3QgcmhzOworICAgIHJocy5zZXQobSk7CisgICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5tdWx0aXBseShyaHMpOworICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOworfQorCit2b2lkIGdsUG9wTWF0cml4KCkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIEdMaW50IGVyciA9IGMtPnRyYW5zZm9ybXMuY3VycmVudC0+cG9wKCk7CisgICAgaWYgKGdnbF91bmxpa2VseShlcnIpKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Cit9CisKK3ZvaWQgZ2xQdXNoTWF0cml4KCkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIEdMaW50IGVyciA9IGMtPnRyYW5zZm9ybXMuY3VycmVudC0+cHVzaCgpOworICAgIGlmIChnZ2xfdW5saWtlbHkoZXJyKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOworfQorCit2b2lkIGdsRnJ1c3R1bWYoCisgICAgICAgIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgCisgICAgICAgIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwKKyAgICAgICAgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgZnJ1c3R1bWYobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhciwgYyk7Cit9CisKK3ZvaWQgZ2xGcnVzdHVteCggCisgICAgICAgIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwKKyAgICAgICAgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLAorICAgICAgICBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBmcnVzdHVtZiggZml4ZWRUb0Zsb2F0KGxlZnQpLCBmaXhlZFRvRmxvYXQocmlnaHQpLAorICAgICAgICAgICAgICBmaXhlZFRvRmxvYXQoYm90dG9tKSwgZml4ZWRUb0Zsb2F0KHRvcCksCisgICAgICAgICAgICAgIGZpeGVkVG9GbG9hdCh6TmVhciksIGZpeGVkVG9GbG9hdCh6RmFyKSwKKyAgICAgICAgICAgICAgYyk7Cit9CisKK3ZvaWQgZ2xPcnRob2YoIAorICAgICAgICBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIAorICAgICAgICBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsCisgICAgICAgIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIG9ydGhvZihsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyLCBjKTsKK30KKwordm9pZCBnbE9ydGhveCgKKyAgICAgICAgR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LAorICAgICAgICBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsCisgICAgICAgIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIG9ydGhvZiggZml4ZWRUb0Zsb2F0KGxlZnQpLCBmaXhlZFRvRmxvYXQocmlnaHQpLAorICAgICAgICAgICAgZml4ZWRUb0Zsb2F0KGJvdHRvbSksIGZpeGVkVG9GbG9hdCh0b3ApLAorICAgICAgICAgICAgZml4ZWRUb0Zsb2F0KHpOZWFyKSwgZml4ZWRUb0Zsb2F0KHpGYXIpLAorICAgICAgICAgICAgYyk7Cit9CisKK3ZvaWQgZ2xSb3RhdGVmKEdMZmxvYXQgYSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+cm90YXRlKGEsIHgsIHksIHopOworICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOworfQorCit2b2lkIGdsUm90YXRleChHTGZpeGVkIGEsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPnJvdGF0ZSggCisgICAgICAgICAgICBmaXhlZFRvRmxvYXQoYSksIGZpeGVkVG9GbG9hdCh4KSwKKyAgICAgICAgICAgIGZpeGVkVG9GbG9hdCh5KSwgZml4ZWRUb0Zsb2F0KHopKTsKKyAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKK30KKwordm9pZCBnbFNjYWxlZihHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5zY2FsZSh4LCB5LCB6KTsKKyAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKK30KKwordm9pZCBnbFNjYWxleChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5zY2FsZSgKKyAgICAgICAgICAgIGZpeGVkVG9GbG9hdCh4KSwgZml4ZWRUb0Zsb2F0KHkpLCBmaXhlZFRvRmxvYXQoeikpOworICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOworfQorCit2b2lkIGdsVHJhbnNsYXRlZihHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT50cmFuc2xhdGUoeCwgeSwgeik7CisgICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Cit9CisKK3ZvaWQgZ2xUcmFuc2xhdGV4KEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPnRyYW5zbGF0ZSgKKyAgICAgICAgICAgIGZpeGVkVG9GbG9hdCh4KSwgZml4ZWRUb0Zsb2F0KHkpLCBmaXhlZFRvRmxvYXQoeikpOworICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOworfQorCit2b2lkIGdsU2Npc3NvcihHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHcsIEdMc2l6ZWkgaCkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIG9nbGVzX3NjaXNzb3IoYywgeCwgeSwgdywgaCk7Cit9CisKK3ZvaWQgZ2xWaWV3cG9ydChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHcsIEdMc2l6ZWkgaCkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIG9nbGVzX3ZpZXdwb3J0KGMsIHgsIHksIHcsIGgpOworfQorCit2b2lkIGdsRGVwdGhSYW5nZWYoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBkZXB0aFJhbmdlZih6TmVhciwgekZhciwgYyk7Cit9CisKK3ZvaWQgZ2xEZXB0aFJhbmdleChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcikKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGRlcHRoUmFuZ2VmKGZpeGVkVG9GbG9hdCh6TmVhciksIGZpeGVkVG9GbG9hdCh6RmFyKSwgYyk7Cit9CisKK3ZvaWQgZ2xQb2x5Z29uT2Zmc2V0eChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPnBvbHlnb25PZmZzZXQuZmFjdG9yID0gZmFjdG9yOworICAgIGMtPnBvbHlnb25PZmZzZXQudW5pdHMgPSB1bml0czsKK30KKwordm9pZCBnbFBvbHlnb25PZmZzZXQoR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT5wb2x5Z29uT2Zmc2V0LmZhY3RvciA9IGdnbEZsb2F0VG9GaXhlZChmYWN0b3IpOworICAgIGMtPnBvbHlnb25PZmZzZXQudW5pdHMgPSBnZ2xGbG9hdFRvRml4ZWQodW5pdHMpOworfQorCitHTGJpdGZpZWxkIGdsUXVlcnlNYXRyaXh4T0VTKEdMZml4ZWQqIG0sIEdMaW50KiBlKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgR0xiaXRmaWVsZCBzdGF0dXMgPSAwOworICAgIEdMZmxvYXQgY29uc3QqIGYgPSBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPnRvcCgpLmVsZW1lbnRzKCk7CisgICAgZm9yICAoaW50IGk9MCA7IGk8MTYgOyBpKyspIHsKKyAgICAgICAgaWYgKGlzbmFuKGZbaV0pIHx8IGlzaW5mKGZbaV0pKSB7CisgICAgICAgICAgICBzdGF0dXMgfD0gMTw8aTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVbaV0gPSBleHBvbmVudChmW2ldKSAtIDc7CisgICAgICAgIG1baV0gPSBtYW50aXNzYShmW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvbWF0cml4LmggYi9vcGVuZ2wvbGliYWdsL21hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTM4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL21hdHJpeC5oCkBAIC0wLDAgKzEsMzU1IEBACisvKiBsaWJzL29wZW5nbGVzL21hdHJpeC5oCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX01BVFJJWF9ICisjZGVmaW5lIEFORFJPSURfT1BFTkdMRVNfTUFUUklYX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8cHJpdmF0ZS9waXhlbGZsaW5nZXIvZ2dsX2NvbnRleHQuaD4KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdCBpbnQgT0dMRVNfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgPSAxNjsKK2NvbnN0IGludCBPR0xFU19QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICA9ICAyOworY29uc3QgaW50IE9HTEVTX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgID0gIDI7CisKK3ZvaWQgb2dsZXNfaW5pdF9tYXRyaXgob2dsZXNfY29udGV4dF90Kik7Cit2b2lkIG9nbGVzX3VuaW5pdF9tYXRyaXgob2dsZXNfY29udGV4dF90Kik7Cit2b2lkIG9nbGVzX2ludmFsaWRhdGVfcGVyc3BlY3RpdmUob2dsZXNfY29udGV4dF90KiBjKTsKK3ZvaWQgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtX2ltcGwob2dsZXNfY29udGV4dF90KiBjLCB1aW50MzJfdCB3YW50KTsKKworaW50IG9nbGVzX3N1cmZhY2Vwb3J0KG9nbGVzX2NvbnRleHRfdCogYywgR0xpbnQgeCwgR0xpbnQgeSk7CisKK3ZvaWQgb2dsZXNfc2Npc3NvcihvZ2xlc19jb250ZXh0X3QqIGMsIAorICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHcsIEdMc2l6ZWkgaCk7CisKK3ZvaWQgb2dsZXNfdmlld3BvcnQob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHcsIEdMc2l6ZWkgaCk7CisKK2lubGluZSB2b2lkIG9nbGVzX3ZhbGlkYXRlX3RyYW5zZm9ybSgKKyAgICAgICAgb2dsZXNfY29udGV4dF90KiBjLCB1aW50MzJfdCB3YW50KQoreworICAgIGlmIChjLT50cmFuc2Zvcm1zLmRpcnR5ICYgd2FudCkKKyAgICAgICAgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtX2ltcGwoYywgd2FudCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5saW5lCitHTGZpeGVkIHZzcXVhcmUzKEdMZml4ZWQgYSwgR0xmaXhlZCBiLCBHTGZpeGVkIGMpIAoreworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQorCisgICAgR0xmaXhlZCByOworICAgIGludDMyX3QgdDsKKyAgICBhc20oCisgICAgICAgICJzbXVsbCAlMCwgJTEsICUyLCAlMiAgICAgICBcbiIKKyAgICAgICAgInNtbGFsICUwLCAlMSwgJTMsICUzICAgICAgIFxuIgorICAgICAgICAic21sYWwgJTAsICUxLCAlNCwgJTQgICAgICAgXG4iCisgICAgICAgICJtb3ZzICAlMCwgJTAsIGxzciAjMTYgICAgICBcbiIKKyAgICAgICAgImFkYyAgICUwLCAlMCwgJTEsIGxzbCAjMTYgIFxuIgorICAgICAgICA6ICAgIj0mciIociksICI9JnIiKHQpIAorICAgICAgICA6ICAgIiVyIihhKSwgInIiKGIpLCAiciIoYykKKyAgICAgICAgOiAgICJjYyIKKyAgICAgICAgKTsgCisgICAgcmV0dXJuIHI7CisKKyNlbHNlCisKKyAgICByZXR1cm4gKCggICBpbnQ2NF90KGEpKmEgKworICAgICAgICAgICAgICAgIGludDY0X3QoYikqYiArCisgICAgICAgICAgICAgICAgaW50NjRfdChjKSpjICsgMHg4MDAwKT4+MTYpOworCisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBHTGZpeGVkIG1sYTJhKCBHTGZpeGVkIGEwLCBHTGZpeGVkIGIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTEsIEdMZml4ZWQgYjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBjKQoreworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIEdMZml4ZWQgcjsKKyAgICBpbnQzMl90IHQ7CisgICAgYXNtKAorICAgICAgICAic211bGwgJTAsICUxLCAlMiwgJTMgICAgICAgXG4iCisgICAgICAgICJzbWxhbCAlMCwgJTEsICU0LCAlNSAgICAgICBcbiIKKyAgICAgICAgImFkZCAgICUwLCAlNiwgJTAsIGxzciAjMTYgIFxuIgorICAgICAgICAiYWRkICAgJTAsICUwLCAlMSwgbHNsICMxNiAgXG4iCisgICAgICAgIDogICAiPSZyIihyKSwgIj0mciIodCkgCisgICAgICAgIDogICAiJXIiKGEwKSwgInIiKGIwKSwgCisgICAgICAgICAgICAiJXIiKGExKSwgInIiKGIxKSwKKyAgICAgICAgICAgICJyIihjKQorICAgICAgICA6CisgICAgICAgICk7IAorICAgIHJldHVybiByOworICAgIAorI2Vsc2UKKworICAgIHJldHVybiAoKCAgIGludDY0X3QoYTApKmIwICsKKyAgICAgICAgICAgICAgICBpbnQ2NF90KGExKSpiMSk+PjE2KSArIGM7CisKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIEdMZml4ZWQgbWxhM2EoIEdMZml4ZWQgYTAsIEdMZml4ZWQgYjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTEsIEdMZml4ZWQgYjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTIsIEdMZml4ZWQgYjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYykKK3sKKyNpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBHTGZpeGVkIHI7CisgICAgaW50MzJfdCB0OworICAgIGFzbSgKKyAgICAgICAgInNtdWxsICUwLCAlMSwgJTIsICUzICAgICAgIFxuIgorICAgICAgICAic21sYWwgJTAsICUxLCAlNCwgJTUgICAgICAgXG4iCisgICAgICAgICJzbWxhbCAlMCwgJTEsICU2LCAlNyAgICAgICBcbiIKKyAgICAgICAgImFkZCAgICUwLCAlOCwgJTAsIGxzciAjMTYgIFxuIgorICAgICAgICAiYWRkICAgJTAsICUwLCAlMSwgbHNsICMxNiAgXG4iCisgICAgICAgIDogICAiPSZyIihyKSwgIj0mciIodCkgCisgICAgICAgIDogICAiJXIiKGEwKSwgInIiKGIwKSwKKyAgICAgICAgICAgICIlciIoYTEpLCAiciIoYjEpLAorICAgICAgICAgICAgIiVyIihhMiksICJyIihiMiksCisgICAgICAgICAgICAiciIoYykKKyAgICAgICAgOgorICAgICAgICApOyAKKyAgICByZXR1cm4gcjsKKyAgICAKKyNlbHNlCisKKyAgICByZXR1cm4gKCggICBpbnQ2NF90KGEwKSpiMCArCisgICAgICAgICAgICAgICAgaW50NjRfdChhMSkqYjEgKworICAgICAgICAgICAgICAgIGludDY0X3QoYTIpKmIyKT4+MTYpICsgYzsKKworI2VuZGlmCit9CisKKy8vIGIwLCBiMSwgYjIgYXJlIHNpZ25lZCAxNi1iaXQgcXVhbml0aWVzCisvLyB0aGF0IGhhdmUgYmVlbiBzaGlmdGVkIHJpZ2h0IGJ5ICdzaGlmdCcgYml0cyByZWxhdGl2ZSB0byBub3JtYWwKKy8vIFMxNi4xNiBmaXhlZCBwb2ludAorc3RhdGljIGlubGluZSBHTGZpeGVkIG1sYTNhMTYoIEdMZml4ZWQgYTAsIGludDMyX3QgYjFiMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTIsIGludDMyX3QgYjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBjKQoreworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIEdMZml4ZWQgcjsKKyAgICBhc20oCisgICAgICAgICJzbXVsd2IgJTAsICUxLCAlMiAgICAgICAgICBcbiIKKyAgICAgICAgInNtbGF3dCAlMCwgJTMsICUyLCAlMCAgICAgIFxuIiAKKyAgICAgICAgInNtbGF3YiAlMCwgJTQsICU1LCAlMCAgICAgIFxuIgorICAgICAgICAiYWRkICAgICUwLCAlNywgJTAsIGxzbCAlNiAgXG4iCisgICAgICAgIDogICAiPSZyIihyKQorICAgICAgICA6ICAgInIiKGEwKSwgInIiKGIxYjApLAorICAgICAgICAgICAgInIiKGExKSwKKyAgICAgICAgICAgICJyIihhMiksICJyIihiMiksCisgICAgICAgICAgICAiciIoc2hpZnQpLAorICAgICAgICAgICAgInIiKGMpCisgICAgICAgIDoKKyAgICAgICAgKTsgCisgICAgcmV0dXJuIHI7CisgICAgCisjZWxzZQorCisgICAgaW50MzJfdCBhY2N1bTsKKyAgICBpbnQxNl90IGIwID0gYjFiMCAmIDB4ZmZmZjsKKyAgICBpbnQxNl90IGIxID0gKGIxYjAgPj4gMTYpICYgMHhmZmZmOworICAgIGFjY3VtICA9IGludDY0X3QoYTApKmludDE2X3QoYjApID4+IDE2OworICAgIGFjY3VtICs9IGludDY0X3QoYTEpKmludDE2X3QoYjEpID4+IDE2OworICAgIGFjY3VtICs9IGludDY0X3QoYTIpKmludDE2X3QoYjIpID4+IDE2OworICAgIGFjY3VtID0gKGFjY3VtIDw8IHNoaWZ0KSArIGM7CisgICAgcmV0dXJuIGFjY3VtOworCisjZW5kaWYKK30KKworCitzdGF0aWMgaW5saW5lIEdMZml4ZWQgbWxhM2ExNl9idGIoIEdMZml4ZWQgYTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYjFiMCwgaW50MzJfdCB4eGIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBjKQoreworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIEdMZml4ZWQgcjsKKyAgICBhc20oCisgICAgICAgICJzbXVsd2IgJTAsICUxLCAlNCAgICAgICAgICBcbiIKKyAgICAgICAgInNtbGF3dCAlMCwgJTIsICU0LCAlMCAgICAgIFxuIiAKKyAgICAgICAgInNtbGF3YiAlMCwgJTMsICU1LCAlMCAgICAgIFxuIgorICAgICAgICAiYWRkICAgICUwLCAlNywgJTAsIGxzbCAlNiAgXG4iCisgICAgICAgIDogICAiPSZyIihyKQorICAgICAgICA6ICAgInIiKGEwKSwKKyAgICAgICAgICAgICJyIihhMSksCisgICAgICAgICAgICAiciIoYTIpLAorICAgICAgICAgICAgInIiKGIxYjApLCAiciIoeHhiMiksCisgICAgICAgICAgICAiciIoc2hpZnQpLAorICAgICAgICAgICAgInIiKGMpCisgICAgICAgIDoKKyAgICAgICAgKTsgCisgICAgcmV0dXJuIHI7CisgICAgCisjZWxzZQorCisgICAgaW50MzJfdCBhY2N1bTsKKyAgICBpbnQxNl90IGIwID0gIGIxYjAgICAgICAgICYgMHhmZmZmOworICAgIGludDE2X3QgYjEgPSAoYjFiMCA+PiAxNikgJiAweGZmZmY7CisgICAgaW50MTZfdCBiMiA9ICB4eGIyICAgICAgICAmIDB4ZmZmZjsKKyAgICBhY2N1bSAgPSBpbnQ2NF90KGEwKSppbnQxNl90KGIwKSA+PiAxNjsKKyAgICBhY2N1bSArPSBpbnQ2NF90KGExKSppbnQxNl90KGIxKSA+PiAxNjsKKyAgICBhY2N1bSArPSBpbnQ2NF90KGEyKSppbnQxNl90KGIyKSA+PiAxNjsKKyAgICBhY2N1bSA9IChhY2N1bSA8PCBzaGlmdCkgKyBjOworICAgIHJldHVybiBhY2N1bTsKKworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgR0xmaXhlZCBtbGEzYTE2X2J0dCggR0xmaXhlZCBhMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiMWIwLCBpbnQzMl90IGIyeHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGMpCit7CisjaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgR0xmaXhlZCByOworICAgIGFzbSgKKyAgICAgICAgInNtdWx3YiAlMCwgJTEsICU0ICAgICAgICAgIFxuIgorICAgICAgICAic21sYXd0ICUwLCAlMiwgJTQsICUwICAgICAgXG4iIAorICAgICAgICAic21sYXd0ICUwLCAlMywgJTUsICUwICAgICAgXG4iCisgICAgICAgICJhZGQgICAgJTAsICU3LCAlMCwgbHNsICU2ICBcbiIKKyAgICAgICAgOiAgICI9JnIiKHIpCisgICAgICAgIDogICAiciIoYTApLAorICAgICAgICAgICAgInIiKGExKSwKKyAgICAgICAgICAgICJyIihhMiksCisgICAgICAgICAgICAiciIoYjFiMCksICJyIihiMnh4KSwKKyAgICAgICAgICAgICJyIihzaGlmdCksCisgICAgICAgICAgICAiciIoYykKKyAgICAgICAgOgorICAgICAgICApOyAKKyAgICByZXR1cm4gcjsKKyAgICAKKyNlbHNlCisKKyAgICBpbnQzMl90IGFjY3VtOworICAgIGludDE2X3QgYjAgPSAgYjFiMCAgICAgICAgJiAweGZmZmY7CisgICAgaW50MTZfdCBiMSA9IChiMWIwID4+IDE2KSAmIDB4ZmZmZjsKKyAgICBpbnQxNl90IGIyID0gKGIyeHggPj4gMTYpICYgMHhmZmZmOworICAgIGFjY3VtICA9IGludDY0X3QoYTApKmludDE2X3QoYjApID4+IDE2OworICAgIGFjY3VtICs9IGludDY0X3QoYTEpKmludDE2X3QoYjEpID4+IDE2OworICAgIGFjY3VtICs9IGludDY0X3QoYTIpKmludDE2X3QoYjIpID4+IDE2OworICAgIGFjY3VtID0gKGFjY3VtIDw8IHNoaWZ0KSArIGM7CisgICAgcmV0dXJuIGFjY3VtOworCisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBHTGZpeGVkIG1sYTMoIEdMZml4ZWQgYTAsIEdMZml4ZWQgYjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMSwgR0xmaXhlZCBiMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGEyLCBHTGZpeGVkIGIyKQoreworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIEdMZml4ZWQgcjsKKyAgICBpbnQzMl90IHQ7CisgICAgYXNtKAorICAgICAgICAic211bGwgJTAsICUxLCAlMiwgJTMgICAgICAgXG4iCisgICAgICAgICJzbWxhbCAlMCwgJTEsICU0LCAlNSAgICAgICBcbiIKKyAgICAgICAgInNtbGFsICUwLCAlMSwgJTYsICU3ICAgICAgIFxuIgorICAgICAgICAibW92cyAgJTAsICUwLCBsc3IgIzE2ICAgICAgXG4iCisgICAgICAgICJhZGMgICAlMCwgJTAsICUxLCBsc2wgIzE2ICBcbiIKKyAgICAgICAgOiAgICI9JnIiKHIpLCAiPSZyIih0KSAKKyAgICAgICAgOiAgICIlciIoYTApLCAiciIoYjApLAorICAgICAgICAgICAgIiVyIihhMSksICJyIihiMSksCisgICAgICAgICAgICAiJXIiKGEyKSwgInIiKGIyKQorICAgICAgICA6ICAgImNjIgorICAgICAgICApOyAKKyAgICByZXR1cm4gcjsKKyAgICAKKyNlbHNlCisKKyAgICByZXR1cm4gKCggICBpbnQ2NF90KGEwKSpiMCArCisgICAgICAgICAgICAgICAgaW50NjRfdChhMSkqYjEgKworICAgICAgICAgICAgICAgIGludDY0X3QoYTIpKmIyICsgMHg4MDAwKT4+MTYpOworCisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBHTGZpeGVkIG1sYTQoIEdMZml4ZWQgYTAsIEdMZml4ZWQgYjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMSwgR0xmaXhlZCBiMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGEyLCBHTGZpeGVkIGIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTMsIEdMZml4ZWQgYjMpCit7CisjaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgR0xmaXhlZCByOworICAgIGludDMyX3QgdDsKKyAgICBhc20oCisgICAgICAgICJzbXVsbCAlMCwgJTEsICUyLCAlMyAgICAgICBcbiIKKyAgICAgICAgInNtbGFsICUwLCAlMSwgJTQsICU1ICAgICAgIFxuIgorICAgICAgICAic21sYWwgJTAsICUxLCAlNiwgJTcgICAgICAgXG4iCisgICAgICAgICJzbWxhbCAlMCwgJTEsICU4LCAlOSAgICAgICBcbiIKKyAgICAgICAgIm1vdnMgICUwLCAlMCwgbHNyICMxNiAgICAgIFxuIgorICAgICAgICAiYWRjICAgJTAsICUwLCAlMSwgbHNsICMxNiAgXG4iCisgICAgICAgIDogICAiPSZyIihyKSwgIj0mciIodCkgCisgICAgICAgIDogICAiJXIiKGEwKSwgInIiKGIwKSwKKyAgICAgICAgICAgICIlciIoYTEpLCAiciIoYjEpLAorICAgICAgICAgICAgIiVyIihhMiksICJyIihiMiksCisgICAgICAgICAgICAiJXIiKGEzKSwgInIiKGIzKQorICAgICAgICA6ICAgImNjIgorICAgICAgICApOyAKKyAgICByZXR1cm4gcjsKKyAgICAKKyNlbHNlCisKKyAgICByZXR1cm4gKCggICBpbnQ2NF90KGEwKSpiMCArCisgICAgICAgICAgICAgICAgaW50NjRfdChhMSkqYjEgKworICAgICAgICAgICAgICAgIGludDY0X3QoYTIpKmIyICsKKyAgICAgICAgICAgICAgICBpbnQ2NF90KGEzKSpiMyArIDB4ODAwMCk+PjE2KTsKKworI2VuZGlmCit9CisKK2lubGluZQorR0xmaXhlZCBkb3Q0KGNvbnN0IEdMZml4ZWQqIGEsIGNvbnN0IEdMZml4ZWQqIGIpIAoreworICAgIHJldHVybiBtbGE0KGFbMF0sIGJbMF0sIGFbMV0sIGJbMV0sIGFbMl0sIGJbMl0sIGFbM10sIGJbM10pOworfQorCisKK2lubGluZQorR0xmaXhlZCBkb3QzKGNvbnN0IEdMZml4ZWQqIGEsIGNvbnN0IEdMZml4ZWQqIGIpIAoreworICAgIHJldHVybiBtbGEzKGFbMF0sIGJbMF0sIGFbMV0sIGJbMV0sIGFbMl0sIGJbMl0pOworfQorCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX01BVFJJWF9ICisKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvbWlwbWFwLmNwcCBiL29wZW5nbC9saWJhZ2wvbWlwbWFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Q3N2I3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9taXBtYXAuY3BwCkBAIC0wLDAgKzEsMTkyIEBACisvKiBsaWJzL29wZW5nbGVzL21pcG1hcC5jcHAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImNvbnRleHQuaCIKKyNpbmNsdWRlICJzdGF0ZS5oIgorI2luY2x1ZGUgInRleHR1cmUuaCIKKyNpbmNsdWRlICJUZXh0dXJlT2JqZWN0TWFuYWdlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgYnVpbGRBUHlyYW1pZChvZ2xlc19jb250ZXh0X3QqIGMsIEVHTFRleHR1cmVPYmplY3QqIHRleCkKK3sKKyAgICBpbnQgbGV2ZWwgPSAwOworICAgIGNvbnN0IEdHTFN1cmZhY2UqIGJhc2UgPSAmdGV4LT5zdXJmYWNlOyAgICAKKyAgICBjb25zdCBHR0xGb3JtYXQmIHBpeGVsRm9ybWF0KGMtPnJhc3Rlcml6ZXIuZm9ybWF0c1tiYXNlLT5mb3JtYXRdKTsKKworICAgIGludCB3ID0gYmFzZS0+d2lkdGg7CisgICAgaW50IGggPSBiYXNlLT5oZWlnaHQ7CisgICAgaWYgKCh3JmgpID09IDEpCisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKworICAgIHcgPSAodz4+MSkgPyA6IDE7CisgICAgaCA9IChoPj4xKSA/IDogMTsKKworICAgIHdoaWxlKHRydWUpIHsKKyAgICAgICAgKytsZXZlbDsKKyAgICAgICAgY29uc3QgaW50IGJwciA9IHcgKiBwaXhlbEZvcm1hdC5zaXplOworICAgICAgICBpZiAodGV4LT5yZWFsbG9jYXRlKGxldmVsLCB3LCBoLCB3LAorICAgICAgICAgICAgICAgIGJhc2UtPmZvcm1hdCwgYmFzZS0+Y29tcHJlc3NlZEZvcm1hdCwgYnByKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIAorICAgICAgICBpbnQgc3RyaWRlID0gdzsKKyAgICAgICAgaW50IGJzID0gYmFzZS0+c3RyaWRlOworICAgICAgICBHR0xTdXJmYWNlJiBjdXIgPSB0ZXgtPmVkaXRNaXAobGV2ZWwpOworCisgICAgICAgIGlmIChiYXNlLT5mb3JtYXQgPT0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1KQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBjb25zdCAqIHNyYyA9ICh1aW50MTZfdCBjb25zdCAqKWJhc2UtPmRhdGE7CisgICAgICAgICAgICB1aW50MTZfdCogZHN0ID0gKHVpbnQxNl90KiljdXIuZGF0YTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IG1hc2sgPSAweDA3RTBGODFGOworICAgICAgICAgICAgZm9yIChpbnQgeT0wIDsgeTxoIDsgeSsrKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9ICh5KjIpICogYnM7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgeD0wIDsgeDx3IDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAwMCA9IHNyY1tvZmZzZXRdOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMTAgPSBzcmNbb2Zmc2V0KzFdOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDEgPSBzcmNbb2Zmc2V0K2JzXTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDExID0gc3JjW29mZnNldCticysxXTsKKyAgICAgICAgICAgICAgICAgICAgcDAwID0gKHAwMCB8IChwMDAgPDwgMTYpKSAmIG1hc2s7CisgICAgICAgICAgICAgICAgICAgIHAwMSA9IChwMDEgfCAocDAxIDw8IDE2KSkgJiBtYXNrOworICAgICAgICAgICAgICAgICAgICBwMTAgPSAocDEwIHwgKHAxMCA8PCAxNikpICYgbWFzazsKKyAgICAgICAgICAgICAgICAgICAgcDExID0gKHAxMSB8IChwMTEgPDwgMTYpKSAmIG1hc2s7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdyYiA9ICgocDAwICsgcDEwICsgcDAxICsgcDExKSA+PiAyKSAmIG1hc2s7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJnYiA9IChncmIgJiAweEZGRkYpIHwgKGdyYiA+PiAxNik7CisgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpzdHJpZGVdID0gcmdiOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYmFzZS0+Zm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBjb25zdCAqIHNyYyA9ICh1aW50MTZfdCBjb25zdCAqKWJhc2UtPmRhdGE7CisgICAgICAgICAgICB1aW50MTZfdCogZHN0ID0gKHVpbnQxNl90KiljdXIuZGF0YTsKKyAgICAgICAgICAgIGZvciAoaW50IHk9MCA7IHk8aCA7IHkrKykgeworICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAoeSoyKSAqIGJzOworICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8dyA7IHgrKykgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDAgPSBzcmNbb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDEwID0gc3JjW29mZnNldCsxXTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDAxID0gc3JjW29mZnNldCtic107CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAxMSA9IHNyY1tvZmZzZXQrYnMrMV07CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHIgPSAoKHAwMD4+MTEpKyhwMTA+PjExKSsocDAxPj4xMSkrKHAxMT4+MTEpKzIpPj4yOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnID0gKCgocDAwPj42KSsocDEwPj42KSsocDAxPj42KSsocDExPj42KSsyKT4+MikmMHgzRjsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYiA9ICgocDAwJjB4M0UpKyhwMTAmMHgzRSkrKHAwMSYweDNFKSsocDExJjB4M0UpKzQpPj4zOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhID0gKChwMDAmMSkrKHAxMCYxKSsocDAxJjEpKyhwMTEmMSkrMik+PjI7CisgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpzdHJpZGVdID0gKHI8PDExKXwoZzw8Nil8KGI8PDEpfGE7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChiYXNlLT5mb3JtYXQgPT0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGNvbnN0ICogc3JjID0gKHVpbnQzMl90IGNvbnN0ICopYmFzZS0+ZGF0YTsKKyAgICAgICAgICAgIHVpbnQzMl90KiBkc3QgPSAodWludDMyX3QqKWN1ci5kYXRhOworICAgICAgICAgICAgZm9yIChpbnQgeT0wIDsgeTxoIDsgeSsrKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9ICh5KjIpICogYnM7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgeD0wIDsgeDx3IDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAwMCA9IHNyY1tvZmZzZXRdOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMTAgPSBzcmNbb2Zmc2V0KzFdOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDEgPSBzcmNbb2Zmc2V0K2JzXTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDExID0gc3JjW29mZnNldCticysxXTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmIwMCA9IHAwMCAmIDB4MDBGRjAwRkY7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJiMDEgPSBwMDEgJiAweDAwRkYwMEZGOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByYjEwID0gcDEwICYgMHgwMEZGMDBGRjsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmIxMSA9IHAxMSAmIDB4MDBGRjAwRkY7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdhMDAgPSAocDAwID4+IDgpICYgMHgwMEZGMDBGRjsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2EwMSA9IChwMDEgPj4gOCkgJiAweDAwRkYwMEZGOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnYTEwID0gKHAxMCA+PiA4KSAmIDB4MDBGRjAwRkY7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdhMTEgPSAocDExID4+IDgpICYgMHgwMEZGMDBGRjsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmIgPSAocmIwMCArIHJiMDEgKyByYjEwICsgcmIxMSk+PjI7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdhID0gKGdhMDAgKyBnYTAxICsgZ2ExMCArIGdhMTEpPj4yOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZ2JhID0gKHJiICYgMHgwMEZGMDBGRikgfCAoKGdhICYgMHgwMEZGMDBGRik8PDgpOworICAgICAgICAgICAgICAgICAgICBkc3RbeCArIHkqc3RyaWRlXSA9IHJnYmE7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoYmFzZS0+Zm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzg4OCkgfHwKKyAgICAgICAgICAgICAgICAgKGJhc2UtPmZvcm1hdCA9PSBHR0xfUElYRUxfRk9STUFUX0xBXzg4KSB8fAorICAgICAgICAgICAgICAgICAoYmFzZS0+Zm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfQV84KSB8fAorICAgICAgICAgICAgICAgICAoYmFzZS0+Zm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfTF84KSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNraXA7CisgICAgICAgICAgICBzd2l0Y2ggKGJhc2UtPmZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQl84ODg6ICBza2lwID0gMzsgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9MQV84ODogICAgc2tpcCA9IDI7ICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSAxOyAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDhfdCBjb25zdCAqIHNyYyA9ICh1aW50OF90IGNvbnN0ICopYmFzZS0+ZGF0YTsKKyAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCA9ICh1aW50OF90KiljdXIuZGF0YTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGJzICo9IHNraXA7CisgICAgICAgICAgICBzdHJpZGUgKj0gc2tpcDsKKyAgICAgICAgICAgIGZvciAoaW50IHk9MCA7IHk8aCA7IHkrKykgeworICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAoeSoyKSAqIGJzOworICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8dyA7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjPTAgOyBjPHNraXAgOyBjKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAwMCA9IHNyY1tjK29mZnNldF07CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMTAgPSBzcmNbYytvZmZzZXQrc2tpcF07CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDEgPSBzcmNbYytvZmZzZXQrYnNdOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDExID0gc3JjW2Mrb2Zmc2V0K2JzK3NraXBdOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3ggKyB5KnN0cmlkZSArIGNdID0gKHAwMCArIHAxMCArIHAwMSArIHAxMSkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMipza2lwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChiYXNlLT5mb3JtYXQgPT0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGNvbnN0ICogc3JjID0gKHVpbnQxNl90IGNvbnN0ICopYmFzZS0+ZGF0YTsKKyAgICAgICAgICAgIHVpbnQxNl90KiBkc3QgPSAodWludDE2X3QqKWN1ci5kYXRhOworICAgICAgICAgICAgZm9yIChpbnQgeT0wIDsgeTxoIDsgeSsrKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9ICh5KjIpICogYnM7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgeD0wIDsgeDx3IDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAwMCA9IHNyY1tvZmZzZXRdOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMTAgPSBzcmNbb2Zmc2V0KzFdOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDEgPSBzcmNbb2Zmc2V0K2JzXTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDExID0gc3JjW29mZnNldCticysxXTsKKyAgICAgICAgICAgICAgICAgICAgcDAwID0gKChwMDAgPDwgMTIpICYgMHgwRjBGMDAwMCkgfCAocDAwICYgMHgwRjBGKTsKKyAgICAgICAgICAgICAgICAgICAgcDEwID0gKChwMTAgPDwgMTIpICYgMHgwRjBGMDAwMCkgfCAocDEwICYgMHgwRjBGKTsKKyAgICAgICAgICAgICAgICAgICAgcDAxID0gKChwMDEgPDwgMTIpICYgMHgwRjBGMDAwMCkgfCAocDAxICYgMHgwRjBGKTsKKyAgICAgICAgICAgICAgICAgICAgcDExID0gKChwMTEgPDwgMTIpICYgMHgwRjBGMDAwMCkgfCAocDExICYgMHgwRjBGKTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmJnYSA9IChwMDAgKyBwMTAgKyBwMDEgKyBwMTEpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJnYmEgPSAocmJnYSAmIDB4MEYwRikgfCAoKHJiZ2E+PjEyKSAmIDB4RjBGMCk7CisgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpzdHJpZGVdID0gcmdiYTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiVW5zdXBwb3J0ZWQgZm9ybWF0ICglZCkiLCBiYXNlLT5mb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXhpdCBjb25kaXRpb246IHdlIGp1c3QgcHJvY2Vzc2VkIHRoZSAxeDEgTE9EcworICAgICAgICBpZiAoKHcmaCkgPT0gMSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGJhc2UgPSAmY3VyOworICAgICAgICB3ID0gKHc+PjEpID8gOiAxOworICAgICAgICBoID0gKGg+PjEpID8gOiAxOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL3ByaW1pdGl2ZXMuY3BwIGIvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTY0YzAyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmNwcApAQCAtMCwwICsxLDExMTEgQEAKKy8qIGxpYnMvb3BlbmdsZXMvcHJpbWl0aXZlcy5jcHAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJjb250ZXh0LmgiCisjaW5jbHVkZSAicHJpbWl0aXZlcy5oIgorI2luY2x1ZGUgImxpZ2h0LmgiCisjaW5jbHVkZSAibWF0cml4LmgiCisjaW5jbHVkZSAidmVydGV4LmgiCisjaW5jbHVkZSAiZnAuaCIKKyNpbmNsdWRlICJUZXh0dXJlT2JqZWN0TWFuYWdlci5oIgorCitleHRlcm4gIkMiIHZvaWQgaXRlcmF0b3JzMDAzMihjb25zdCB2b2lkKiB0aGF0LAorICAgICAgICBpbnQzMl90KiBpdCwgaW50MzJfdCBjMCwgaW50MzJfdCBjMSwgaW50MzJfdCBjMik7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBwcmltaXRpdmVfcG9pbnQob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdik7CitzdGF0aWMgdm9pZCBwcmltaXRpdmVfbGluZShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxKTsKK3N0YXRpYyB2b2lkIHByaW1pdGl2ZV9jbGlwX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2Mik7CisKK3N0YXRpYyB2b2lkIHByaW1pdGl2ZV9ub3BfcG9pbnQob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdik7CitzdGF0aWMgdm9pZCBwcmltaXRpdmVfbm9wX2xpbmUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSk7CitzdGF0aWMgdm9pZCBwcmltaXRpdmVfbm9wX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2Mik7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjdWxsX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2Mik7CisKK3N0YXRpYyB2b2lkIGxlcnBfdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKTsKKworc3RhdGljIHZvaWQgbGVycF90ZXhjb29yZHMob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKTsKKworc3RhdGljIHZvaWQgbGVycF90ZXhjb29yZHNfdyhvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpOworCitzdGF0aWMgdm9pZCB0cmlhbmdsZShvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpOworCitzdGF0aWMgdm9pZCBjbGlwX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2Mik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2xpcF9saW5lKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgdmVydGV4X3QqIHMsIHZlcnRleF90KiBwKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjZW5kaWYKKworc3RhdGljIHZvaWQgbGlnaHRUcmlhbmdsZURhcmtTbW9vdGgob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQoreworICAgIGlmICghKHYwLT5mbGFncyAmIHZlcnRleF90OjpMSVQpKSB7CisgICAgICAgIHYwLT5mbGFncyB8PSB2ZXJ0ZXhfdDo6TElUOworICAgICAgICBjb25zdCBHTHZvaWQqIGNwID0gYy0+YXJyYXlzLmNvbG9yLmVsZW1lbnQoCisgICAgICAgICAgICAgICAgdjAtPmluZGV4ICYgdmVydGV4X2NhY2hlX3Q6OklOREVYX01BU0spOworICAgICAgICBjLT5hcnJheXMuY29sb3IuZmV0Y2goYywgdjAtPmNvbG9yLnYsIGNwKTsKKyAgICB9CisgICAgaWYgKCEodjEtPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpIHsKKyAgICAgICAgdjEtPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7CisgICAgICAgIGNvbnN0IEdMdm9pZCogY3AgPSBjLT5hcnJheXMuY29sb3IuZWxlbWVudCgKKyAgICAgICAgICAgICAgICB2MS0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSyk7CisgICAgICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2MS0+Y29sb3IudiwgY3ApOworICAgIH0KKyAgICBpZighKHYyLT5mbGFncyAmIHZlcnRleF90OjpMSVQpKSB7CisgICAgICAgIHYyLT5mbGFncyB8PSB2ZXJ0ZXhfdDo6TElUOworICAgICAgICBjb25zdCBHTHZvaWQqIGNwID0gYy0+YXJyYXlzLmNvbG9yLmVsZW1lbnQoCisgICAgICAgICAgICAgICAgdjItPmluZGV4ICYgdmVydGV4X2NhY2hlX3Q6OklOREVYX01BU0spOworICAgICAgICBjLT5hcnJheXMuY29sb3IuZmV0Y2goYywgdjItPmNvbG9yLnYsIGNwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGxpZ2h0VHJpYW5nbGVEYXJrRmxhdChvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgaWYgKCEodjItPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpIHsKKyAgICAgICAgdjItPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7CisgICAgICAgIGNvbnN0IEdMdm9pZCogY3AgPSBjLT5hcnJheXMuY29sb3IuZWxlbWVudCgKKyAgICAgICAgICAgICAgICB2Mi0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSyk7CisgICAgICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2Mi0+Y29sb3IudiwgY3ApOworICAgIH0KKyAgICAvLyBjb25maWd1cmUgdGhlIHJhc3Rlcml6ZXIgaGVyZSwgYmVmb3JlIHdlIGNsaXAKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNvbG9yNHh2KGMsIHYyLT5jb2xvci52KTsKK30KKworc3RhdGljIHZvaWQgbGlnaHRUcmlhbmdsZVNtb290aChvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgaWYgKCEodjAtPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpCisgICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VmVydGV4KGMsIHYwKTsKKyAgICBpZiAoISh2MS0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkKKyAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXgoYywgdjEpOworICAgIGlmKCEodjItPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpCisgICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VmVydGV4KGMsIHYyKTsKK30KKworc3RhdGljIHZvaWQgbGlnaHRUcmlhbmdsZUZsYXQob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQoreworICAgIGlmICghKHYyLT5mbGFncyAmIHZlcnRleF90OjpMSVQpKQorICAgICAgICBjLT5saWdodGluZy5saWdodFZlcnRleChjLCB2Mik7CisgICAgLy8gY29uZmlndXJlIHRoZSByYXN0ZXJpemVyIGhlcmUsIGJlZm9yZSB3ZSBjbGlwCisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5jb2xvcjR4dihjLCB2Mi0+Y29sb3Iudik7Cit9CisKKy8vIFRoZSBmb2cgdmVyc2lvbnMuLi4KKworc3RhdGljIGlubGluZQordm9pZCBsaWdodFZlcnRleERhcmtTbW9vdGhGb2cob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikKK3sKKyAgICBpZiAoISh2LT5mbGFncyAmIHZlcnRleF90OjpMSVQpKSB7CisgICAgICAgIHYtPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7CisgICAgICAgIHYtPmZvZyA9IGMtPmZvZy5mb2coYywgdi0+ZXllLnopOworICAgICAgICBjb25zdCBHTHZvaWQqIGNwID0gYy0+YXJyYXlzLmNvbG9yLmVsZW1lbnQoCisgICAgICAgICAgICAgICAgdi0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSyk7CisgICAgICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2LT5jb2xvci52LCBjcCk7CisgICAgfQorfQorc3RhdGljIGlubGluZQordm9pZCBsaWdodFZlcnRleERhcmtGbGF0Rm9nKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCit7CisgICAgaWYgKCEodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkgeworICAgICAgICB2LT5mbGFncyB8PSB2ZXJ0ZXhfdDo6TElUOworICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPmV5ZS56KTsKKyAgICB9Cit9CitzdGF0aWMgaW5saW5lCit2b2lkIGxpZ2h0VmVydGV4U21vb3RoRm9nKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCit7CisgICAgaWYgKCEodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkgeworICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPmV5ZS56KTsKKyAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXgoYywgdik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBsaWdodFRyaWFuZ2xlRGFya1Ntb290aEZvZyhvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgbGlnaHRWZXJ0ZXhEYXJrU21vb3RoRm9nKGMsIHYwKTsKKyAgICBsaWdodFZlcnRleERhcmtTbW9vdGhGb2coYywgdjEpOworICAgIGxpZ2h0VmVydGV4RGFya1Ntb290aEZvZyhjLCB2Mik7Cit9CisKK3N0YXRpYyB2b2lkIGxpZ2h0VHJpYW5nbGVEYXJrRmxhdEZvZyhvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgbGlnaHRWZXJ0ZXhEYXJrRmxhdEZvZyhjLCB2MCk7CisgICAgbGlnaHRWZXJ0ZXhEYXJrRmxhdEZvZyhjLCB2MSk7CisgICAgbGlnaHRWZXJ0ZXhEYXJrU21vb3RoRm9nKGMsIHYyKTsKKyAgICAvLyBjb25maWd1cmUgdGhlIHJhc3Rlcml6ZXIgaGVyZSwgYmVmb3JlIHdlIGNsaXAKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNvbG9yNHh2KGMsIHYyLT5jb2xvci52KTsKK30KKworc3RhdGljIHZvaWQgbGlnaHRUcmlhbmdsZVNtb290aEZvZyhvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgbGlnaHRWZXJ0ZXhTbW9vdGhGb2coYywgdjApOworICAgIGxpZ2h0VmVydGV4U21vb3RoRm9nKGMsIHYxKTsKKyAgICBsaWdodFZlcnRleFNtb290aEZvZyhjLCB2Mik7Cit9CisKK3N0YXRpYyB2b2lkIGxpZ2h0VHJpYW5nbGVGbGF0Rm9nKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKK3sKKyAgICBsaWdodFZlcnRleERhcmtGbGF0Rm9nKGMsIHYwKTsKKyAgICBsaWdodFZlcnRleERhcmtGbGF0Rm9nKGMsIHYxKTsKKyAgICBsaWdodFZlcnRleFNtb290aEZvZyhjLCB2Mik7CisgICAgLy8gY29uZmlndXJlIHRoZSByYXN0ZXJpemVyIGhlcmUsIGJlZm9yZSB3ZSBjbGlwCisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5jb2xvcjR4dihjLCB2Mi0+Y29sb3Iudik7Cit9CisKKworCit0eXBlZGVmIHZvaWQgKCpsaWdodF9wcmltaXRpdmVfdCkob2dsZXNfY29udGV4dF90KiwKKyAgICAgICAgdmVydGV4X3QqLCB2ZXJ0ZXhfdCosIHZlcnRleF90Kik7CisKKy8vIGZvZyAweDQsIGxpZ2h0IDB4Miwgc21vb3RoIDB4MQorc3RhdGljIGNvbnN0IGxpZ2h0X3ByaW1pdGl2ZV90IGxpZ2h0UHJpbWl0aXZlWzhdID0geworICAgIGxpZ2h0VHJpYW5nbGVEYXJrRmxhdCwgICAgICAgICAgLy8gbm8gZm9nIHwgZGFyayAgfCBmbGF0CisgICAgbGlnaHRUcmlhbmdsZURhcmtTbW9vdGgsICAgICAgICAvLyBubyBmb2cgfCBkYXJrICB8IHNtb290aAorICAgIGxpZ2h0VHJpYW5nbGVGbGF0LCAgICAgICAgICAgICAgLy8gbm8gZm9nIHwgbGlnaHQgfCBmbGF0CisgICAgbGlnaHRUcmlhbmdsZVNtb290aCwgICAgICAgICAgICAvLyBubyBmb2cgfCBsaWdodCB8IHNtb290aAorICAgIGxpZ2h0VHJpYW5nbGVEYXJrRmxhdEZvZywgICAgICAgLy8gZm9nICAgIHwgZGFyayAgfCBmbGF0CisgICAgbGlnaHRUcmlhbmdsZURhcmtTbW9vdGhGb2csICAgICAvLyBmb2cgICAgfCBkYXJrICB8IHNtb290aAorICAgIGxpZ2h0VHJpYW5nbGVGbGF0Rm9nLCAgICAgICAgICAgLy8gZm9nICAgIHwgbGlnaHQgfCBmbGF0CisgICAgbGlnaHRUcmlhbmdsZVNtb290aEZvZyAgICAgICAgICAvLyBmb2cgICAgfCBsaWdodCB8IHNtb290aAorfTsKKwordm9pZCBvZ2xlc192YWxpZGF0ZV9wcmltaXRpdmVzKG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBjb25zdCB1aW50MzJfdCBlbmFibGVzID0gYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVzOworCisgICAgLy8gc2V0IHVwIHRoZSBsaWdodGluZy9zaGFkaW5nL3Ntb290aGluZy9mb2dnaW5nIGZ1bmN0aW9uCisgICAgaW50IGluZGV4ID0gZW5hYmxlcyAmIEdHTF9FTkFCTEVfU01PT1RIID8gMHgxIDogMDsKKyAgICBpbmRleCB8PSBjLT5saWdodGluZy5lbmFibGUgPyAweDIgOiAwOworICAgIGluZGV4IHw9IGVuYWJsZXMgJiBHR0xfRU5BQkxFX0ZPRyA/IDB4NCA6IDA7CisgICAgYy0+bGlnaHRpbmcubGlnaHRUcmlhbmdsZSA9IGxpZ2h0UHJpbWl0aXZlW2luZGV4XTsKKyAgICAKKyAgICAvLyBzZXQgdXAgdGhlIHByaW1pdGl2ZSByZW5kZXJlcnMKKyAgICBpZiAoZ2dsX2xpa2VseShjLT5hcnJheXMudmVydGV4LmVuYWJsZSkpIHsKKyAgICAgICAgYy0+cHJpbXMucmVuZGVyUG9pbnQgICAgPSBwcmltaXRpdmVfcG9pbnQ7CisgICAgICAgIGMtPnByaW1zLnJlbmRlckxpbmUgICAgID0gcHJpbWl0aXZlX2xpbmU7CisgICAgICAgIGMtPnByaW1zLnJlbmRlclRyaWFuZ2xlID0gcHJpbWl0aXZlX2NsaXBfdHJpYW5nbGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYy0+cHJpbXMucmVuZGVyUG9pbnQgICAgPSBwcmltaXRpdmVfbm9wX3BvaW50OworICAgICAgICBjLT5wcmltcy5yZW5kZXJMaW5lICAgICA9IHByaW1pdGl2ZV9ub3BfbGluZTsKKyAgICAgICAgYy0+cHJpbXMucmVuZGVyVHJpYW5nbGUgPSBwcmltaXRpdmVfbm9wX3RyaWFuZ2xlOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIGNvbXB1dGVfaXRlcmF0b3JzX3Q6OmluaXRUcmlhbmdsZSgKKyAgICAgICAgdmVydGV4X3QgY29uc3QqIHYwLCB2ZXJ0ZXhfdCBjb25zdCogdjEsIHZlcnRleF90IGNvbnN0KiB2MikKK3sKKyAgICBtX2R4MDEgPSB2MS0+d2luZG93LnggLSB2MC0+d2luZG93Lng7CisgICAgbV9keTEwID0gdjAtPndpbmRvdy55IC0gdjEtPndpbmRvdy55OworICAgIG1fZHgyMCA9IHYwLT53aW5kb3cueCAtIHYyLT53aW5kb3cueDsKKyAgICBtX2R5MDIgPSB2Mi0+d2luZG93LnkgLSB2MC0+d2luZG93Lnk7CisgICAgbV9hcmVhID0gbV9keDAxKm1fZHkwMiArICgtbV9keTEwKSptX2R4MjA7Cit9CisKK3ZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aW5pdExpbmUoCisgICAgICAgIHZlcnRleF90IGNvbnN0KiB2MCwgdmVydGV4X3QgY29uc3QqIHYxKQoreworICAgIG1fZHgwMSA9IG1fZHkwMiA9IHYxLT53aW5kb3cueCAtIHYwLT53aW5kb3cueDsKKyAgICBtX2R5MTAgPSBtX2R4MjAgPSB2MC0+d2luZG93LnkgLSB2MS0+d2luZG93Lnk7CisgICAgbV9hcmVhID0gbV9keDAxKm1fZHkwMiArICgtbV9keTEwKSptX2R4MjA7Cit9CisKK3ZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aW5pdExlcnAodmVydGV4X3QgY29uc3QqIHYwLCB1aW50MzJfdCBlbmFibGVzKQoreworICAgIG1feDAgPSB2MC0+d2luZG93Lng7CisgICAgbV95MCA9IHYwLT53aW5kb3cueTsKKyAgICBjb25zdCBHR0xjb29yZCBhcmVhID0gKG1fYXJlYSArIFRSSV9IQUxGKSA+PiBUUklfRlJBQ1RJT05fQklUUzsKKyAgICBjb25zdCBHR0xjb29yZCBtaW5BcmVhID0gMjsgLy8gY2Fubm90IGJlIGludmVydGVkCisgICAgLy8gdHJpYW5nbGVzIHdpdGggYW4gYXJlYSBzbWFsbGVyIHRoYW4gMS4wIGFyZSBub3Qgc21vb3RoLXNoYWRlZAorCisgICAgaW50IHE9MCwgcz0wLCBkPTA7CisgICAgaWYgKGFicyhhcmVhKSA+PSBtaW5BcmVhKSB7CisgICAgICAgIC8vIEhlcmUgd2UgZG8gc29tZSB2b29kb28gbWFnaWMsIHRvIGNvbXB1dGUgYSBzdWl0YWJsZSBzY2FsZQorICAgICAgICAvLyBmYWN0b3IgZm9yIGRlbHRhcy9hcmVhOgorCisgICAgICAgIC8vIEZpcnN0IGNvbXB1dGUgdGhlIDEvYXJlYSB3aXRoIGZ1bGwgMzItYml0cyBwcmVjaXNpb24sCisgICAgICAgIC8vIGdnbFJlY2lwUU5vcm1hbGl6ZWQgcmV0dXJucyBhIG51bWJlciBbLTAuNSwgMC41WyBhbmQgYW4gZXhwb25lbnQuCisgICAgICAgIGQgPSBnZ2xSZWNpcFFOb3JtYWxpemVkKGFyZWEsICZxKTsKKworICAgICAgICAvLyBUaGVuIGNvbXB1dGUgdGhlIG1pbmltdW0gbGVmdC1zaGlmdCB0byBub3Qgb3ZlcmZsb3cgdGhlIG11bHMKKyAgICAgICAgLy8gYmVsb3cuIAorICAgICAgICBzID0gMzIgLSBnZ2xDbHooYWJzKG1fZHkwMil8YWJzKG1fZHkxMCl8YWJzKG1fZHgwMSl8YWJzKG1fZHgyMCkpOworCisgICAgICAgIC8vIFdlJ2xsIGtlZXAgMTYtYml0cyBvZiBwcmVjaXNpb24gZm9yIGRlbHRhcy9hcmVhLiBTbyB3ZSBuZWVkCisgICAgICAgIC8vIHRvIHNoaWZ0IGV2ZXJ5dGhpbmcgbGVmdCBhbiBleHRyYSAxNSBiaXRzLgorICAgICAgICBzICs9IDE1OworICAgICAgICAKKyAgICAgICAgLy8gbWFrZSBzdXJlIGFsbCBmaW5hbCBzaGlmdHMgYXJlIG5vdCA+IDMyLCBiZWNhdXNlIGdnbE11bHgKKyAgICAgICAgLy8gY2FuJ3QgaGFuZGxlIGl0LgorICAgICAgICBpZiAocyA8IHEpIHMgPSBxOworICAgICAgICBpZiAocyA+IDMyKSB7CisgICAgICAgICAgICBkID4+PSAzMi1zOworICAgICAgICAgICAgcyA9IDMyOworICAgICAgICB9CisgICAgfQorCisgICAgbV9keDAxID0gZ2dsTXVseChtX2R4MDEsIGQsIHMpOworICAgIG1fZHkxMCA9IGdnbE11bHgobV9keTEwLCBkLCBzKTsKKyAgICBtX2R4MjAgPSBnZ2xNdWx4KG1fZHgyMCwgZCwgcyk7CisgICAgbV9keTAyID0gZ2dsTXVseChtX2R5MDIsIGQsIHMpOworICAgIG1fYXJlYV9zY2FsZSA9IDMyICsgcSAtIHM7CisgICAgbV9zY2FsZSA9IDA7CisKKyAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykgeworICAgICAgICBjb25zdCBpbnQgQSA9IGdnbENseihhYnMobV9keTAyKXxhYnMobV9keTEwKXxhYnMobV9keDAxKXxhYnMobV9keDIwKSk7CisgICAgICAgIGNvbnN0IGludCBCID0gZ2dsQ2x6KGFicyhtX3gwKXxhYnMobV95MCkpOworICAgICAgICBtX3NjYWxlID0gbWF4KDAsIDMyIC0gKEEgKyAxNikpICsKKyAgICAgICAgICAgICAgICAgIG1heCgwLCAzMiAtIChCICsgVFJJX0ZSQUNUSU9OX0JJVFMpKSArIDE7CisgICAgfQorfQorCitpbnQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aXRlcmF0b3JzU2NhbGUoR0dMZml4ZWQqIGl0LAorICAgICAgICBpbnQzMl90IGMwLCBpbnQzMl90IGMxLCBpbnQzMl90IGMyKSBjb25zdAoreworICAgIGludDMyX3QgZGMwMSA9IGMxIC0gYzA7CisgICAgaW50MzJfdCBkYzAyID0gYzIgLSBjMDsKKyAgICBjb25zdCBpbnQgQSA9IGdnbENseihhYnMoYzApKTsKKyAgICBjb25zdCBpbnQgQiA9IGdnbENseihhYnMoZGMwMSl8YWJzKGRjMDIpKTsKKyAgICBjb25zdCBpbnQgc2NhbGUgPSBtaW4oQSwgQiAtIG1fc2NhbGUpIC0gMjsKKyAgICBpZiAoc2NhbGUgPj0gMCkgeworICAgICAgICBjMCAgIDw8PSBzY2FsZTsKKyAgICAgICAgZGMwMSA8PD0gc2NhbGU7CisgICAgICAgIGRjMDIgPDw9IHNjYWxlOworICAgIH0gZWxzZSB7CisgICAgICAgIGMwICAgPj49IC1zY2FsZTsKKyAgICAgICAgZGMwMSA+Pj0gLXNjYWxlOworICAgICAgICBkYzAyID4+PSAtc2NhbGU7CisgICAgfQorICAgIGNvbnN0IGludCBzID0gbV9hcmVhX3NjYWxlOworICAgIGludDMyX3QgZGNkeCA9IGdnbE11bEFkZHgoZGMwMSwgbV9keTAyLCBnZ2xNdWx4KGRjMDIsIG1fZHkxMCwgcyksIHMpOworICAgIGludDMyX3QgZGNkeSA9IGdnbE11bEFkZHgoZGMwMiwgbV9keDAxLCBnZ2xNdWx4KGRjMDEsIG1fZHgyMCwgcyksIHMpOworICAgIGludDMyX3QgYyA9IGMwIC0gKGdnbE11bEFkZHgoZGNkeCwgbV94MCwgCisgICAgICAgICAgICBnZ2xNdWx4KGRjZHksIG1feTAsIFRSSV9GUkFDVElPTl9CSVRTKSwgVFJJX0ZSQUNUSU9OX0JJVFMpKTsKKyAgICBpdFswXSA9IGM7CisgICAgaXRbMV0gPSBkY2R4OworICAgIGl0WzJdID0gZGNkeTsKKyAgICByZXR1cm4gc2NhbGU7Cit9CisKK3ZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aXRlcmF0b3JzMTYxNihHR0xmaXhlZCogaXQsCisgICAgICAgIEdHTGZpeGVkIGMwLCBHR0xmaXhlZCBjMSwgR0dMZml4ZWQgYzIpIGNvbnN0Cit7CisgICAgY29uc3QgR0dMZml4ZWQgZGMwMSA9IGMxIC0gYzA7CisgICAgY29uc3QgR0dMZml4ZWQgZGMwMiA9IGMyIC0gYzA7CisgICAgLy8gMTYuMTYgeCAxNi4xNiA9PSAzMi4zMiAtLT4gMTYuMTYKKyAgICBjb25zdCBpbnQgcyA9IG1fYXJlYV9zY2FsZTsKKyAgICBpbnQzMl90IGRjZHggPSBnZ2xNdWxBZGR4KGRjMDEsIG1fZHkwMiwgZ2dsTXVseChkYzAyLCBtX2R5MTAsIHMpLCBzKTsKKyAgICBpbnQzMl90IGRjZHkgPSBnZ2xNdWxBZGR4KGRjMDIsIG1fZHgwMSwgZ2dsTXVseChkYzAxLCBtX2R4MjAsIHMpLCBzKTsKKyAgICBpbnQzMl90IGMgPSBjMCAtIChnZ2xNdWxBZGR4KGRjZHgsIG1feDAsCisgICAgICAgICAgICBnZ2xNdWx4KGRjZHksIG1feTAsIFRSSV9GUkFDVElPTl9CSVRTKSwgVFJJX0ZSQUNUSU9OX0JJVFMpKTsKKyAgICBpdFswXSA9IGM7CisgICAgaXRbMV0gPSBkY2R4OworICAgIGl0WzJdID0gZGNkeTsKK30KKwordm9pZCBjb21wdXRlX2l0ZXJhdG9yc190OjppdGVyYXRvcnMwMDMyKGludDY0X3QqIGl0LAorICAgICAgICBpbnQzMl90IGMwLCBpbnQzMl90IGMxLCBpbnQzMl90IGMyKSBjb25zdAoreworICAgIGNvbnN0IGludCBzID0gbV9hcmVhX3NjYWxlIC0gMTY7CisgICAgaW50MzJfdCBkYzAxID0gKGMxIC0gYzApPj5zOworICAgIGludDMyX3QgZGMwMiA9IChjMiAtIGMwKT4+czsKKyAgICAvLyAxNi4xNiB4IDE2LjE2ID09IDMyLjMyCisgICAgaW50NjRfdCBkY2R4ID0gZ2dsTXVsaWkoZGMwMSwgbV9keTAyKSArIGdnbE11bGlpKGRjMDIsIG1fZHkxMCk7CisgICAgaW50NjRfdCBkY2R5ID0gZ2dsTXVsaWkoZGMwMiwgbV9keDAxKSArIGdnbE11bGlpKGRjMDEsIG1fZHgyMCk7CisgICAgaXRbIDBdID0gKGMwPDwxNikgLSAoKGRjZHgqbV94MCArIGRjZHkqbV95MCk+PjQpOworICAgIGl0WyAxXSA9IGRjZHg7CisgICAgaXRbIDJdID0gZGNkeTsKK30KKworI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQoraW5saW5lIHZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aXRlcmF0b3JzMDAzMihpbnQzMl90KiBpdCwKKyAgICAgICAgaW50MzJfdCBjMCwgaW50MzJfdCBjMSwgaW50MzJfdCBjMikgY29uc3QKK3sKKyAgICA6Oml0ZXJhdG9yczAwMzIodGhpcywgaXQsIGMwLCBjMSwgYzIpOworfQorI2Vsc2UKK3ZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aXRlcmF0b3JzMDAzMihpbnQzMl90KiBpdCwKKyAgICAgICAgaW50MzJfdCBjMCwgaW50MzJfdCBjMSwgaW50MzJfdCBjMikgY29uc3QKK3sKKyAgICBpbnQ2NF90IGl0NjRbM107CisgICAgaXRlcmF0b3JzMDAzMihpdCwgYzAsIGMxLCBjMik7CisgICAgaXRbMF0gPSBpdDY0WzBdOworICAgIGl0WzFdID0gaXQ2NFsxXTsKKyAgICBpdFsyXSA9IGl0NjRbMl07Cit9CisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW5saW5lIGludDMyX3QgY2xhbXBaKEdMZml4ZWQgeikgQ09OU1Q7CitpbnQzMl90IGNsYW1wWihHTGZpeGVkIHopIHsKKyAgICB6ID0gKHogJiB+KHo+PjMxKSk7CisgICAgaWYgKHogPj0gMHgxMDAwMCkKKyAgICAgICAgeiA9IDB4RkZGRjsKKyAgICByZXR1cm4gejsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK3ZvaWQgZmV0Y2hfdGV4Y29vcmRfaW1wbChvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgdmVydGV4X3QqIGNvbnN0IHZ0eFszXSA9IHsgdjAsIHYxLCB2MiB9OworICAgIGFycmF5X3QgY29uc3QgKiBjb25zdCB0ZXhjb29yZEFycmF5ID0gYy0+YXJyYXlzLnRleHR1cmU7CisgICAgCisgICAgZm9yIChpbnQgaT0wIDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKSB7CisgICAgICAgIGlmICghKGMtPnJhc3Rlcml6ZXIuc3RhdGUudGV4dHVyZVtpXS5lbmFibGUpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBqPTAgOyBqPDMgOyBqKyspIHsKKyAgICAgICAgICAgIHZlcnRleF90KiBjb25zdCB2ID0gdnR4W2pdOworICAgICAgICAgICAgaWYgKHYtPmZsYWdzICYgdmVydGV4X3Q6OlRUKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvLyBOT1RFOiBoZXJlIHdlIGNvdWxkIGNvbXB1dGUgYXV0b21hdGljIHRleGdlbgorICAgICAgICAgICAgLy8gc3VjaCBhcyBzcGhlcmUvY3ViZSBtYXBzLCBpbnN0ZWFkIG9mIGZldGNoaW5nIHRoZW0KKyAgICAgICAgICAgIC8vIGZyb20gdGhlIHRleHRjb29yZCBhcnJheS4KKworICAgICAgICAgICAgdmVjNF90JiBjb29yZHMgPSB2LT50ZXh0dXJlW2ldOworICAgICAgICAgICAgY29uc3QgR0x1Ynl0ZSogdHAgPSB0ZXhjb29yZEFycmF5W2ldLmVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgIHYtPmluZGV4ICYgdmVydGV4X2NhY2hlX3Q6OklOREVYX01BU0spOworICAgICAgICAgICAgdGV4Y29vcmRBcnJheVtpXS5mZXRjaChjLCBjb29yZHMudiwgdHApOworCisgICAgICAgICAgICAvLyB0cmFuc2Zvcm0gdGV4dHVyZSBjb29yZGluYXRlcy4uLgorICAgICAgICAgICAgY29vcmRzLlEgPSAweDEwMDAwOworICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtX3QmIHRyID0gYy0+dHJhbnNmb3Jtcy50ZXh0dXJlW2ldLnRyYW5zZm9ybTsgCisgICAgICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KHRyLm9wcykpIHsKKyAgICAgICAgICAgICAgICBjLT5hcnJheXMudGV4X3RyYW5zZm9ybVtpXSgmdHIsICZjb29yZHMsICZjb29yZHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkaXZpZGUgYnkgUQorICAgICAgICAgICAgY29uc3QgR0dMZml4ZWQgcSA9IGNvb3Jkcy5ROworICAgICAgICAgICAgaWYgKGdnbF91bmxpa2VseShxICE9IDB4MTAwMDApKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBxaW52ID0gZ2dsUmVjaXAyOChxKTsKKyAgICAgICAgICAgICAgICBjb29yZHMuUyA9IGdnbE11bHgoY29vcmRzLlMsIHFpbnYsIDI4KTsKKyAgICAgICAgICAgICAgICBjb29yZHMuVCA9IGdnbE11bHgoY29vcmRzLlQsIHFpbnYsIDI4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB2MC0+ZmxhZ3MgfD0gdmVydGV4X3Q6OlRUOworICAgIHYxLT5mbGFncyB8PSB2ZXJ0ZXhfdDo6VFQ7CisgICAgdjItPmZsYWdzIHw9IHZlcnRleF90OjpUVDsKK30KKworaW5saW5lIHZvaWQgZmV0Y2hfdGV4Y29vcmQob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQoreworICAgIGNvbnN0IHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7CisgICAgaWYgKCEoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEZldGNoICYgdHJhbnNmb3JtIHRleHR1cmUgY29vcmRpbmF0ZXMuLi4KKyAgICBpZiAoZ2dsX2xpa2VseSh2MC0+ZmxhZ3MgJiB2MS0+ZmxhZ3MgJiB2Mi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6VFQpKSB7CisgICAgICAgIC8vIGFscmVhZHkgZG9uZSBmb3IgYWxsIHRocmVlIHZlcnRpY2VzLCBiYWlsLi4uCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmV0Y2hfdGV4Y29vcmRfaW1wbChjLCB2MCwgdjEsIHYyKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgUG9pbnQKKyNlbmRpZgorCit2b2lkIHByaW1pdGl2ZV9ub3BfcG9pbnQob2dsZXNfY29udGV4dF90KiwgdmVydGV4X3QqKSB7Cit9CisKK3ZvaWQgcHJpbWl0aXZlX3BvaW50KG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCit7CisgICAgLy8gbGlnaHRpbmcgJiBjbGFtcGluZy4uLgorICAgIGNvbnN0IHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7CisKKyAgICBpZiAoZ2dsX3VubGlrZWx5KCEodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkpIHsKKyAgICAgICAgaWYgKGMtPmxpZ2h0aW5nLmVuYWJsZSkgeworICAgICAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXgoYywgdik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2LT5mbGFncyB8PSB2ZXJ0ZXhfdDo6TElUOworICAgICAgICAgICAgY29uc3QgR0x2b2lkKiBjcCA9IGMtPmFycmF5cy5jb2xvci5lbGVtZW50KAorICAgICAgICAgICAgICAgICAgICB2LT5pbmRleCAmIHZlcnRleF9jYWNoZV90OjpJTkRFWF9NQVNLKTsKKyAgICAgICAgICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2LT5jb2xvci52LCBjcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX0ZPRykgeworICAgICAgICAgICAgdi0+Zm9nID0gYy0+Zm9nLmZvZyhjLCB2LT5leWUueik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBYWFg6IHdlIGRvbid0IG5lZWQgdG8gZG8gdGhhdCBlYWNoLXRpbWUKKyAgICAvLyBpZiBjb2xvciBhcnJheSBhbmQgbGlnaHRpbmcgbm90IGVuYWJsZWQgCisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5jb2xvcjR4dihjLCB2LT5jb2xvci52KTsKKworICAgIC8vIFhYWDogbG9vayBpbnRvIEVTIHBvaW50LXNwcml0ZSBleHRlbnNpb24KKyAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykgeworICAgICAgICBmZXRjaF90ZXhjb29yZChjLCB2LHYsdik7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgeworICAgICAgICAgICAgaWYgKCFjLT5yYXN0ZXJpemVyLnN0YXRlLnRleHR1cmVbaV0uZW5hYmxlKSAKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGludDMyX3QgaXR0WzhdOworICAgICAgICAgICAgaXR0WzFdID0gaXR0WzJdID0gaXR0WzRdID0gaXR0WzVdID0gMDsKKyAgICAgICAgICAgIGl0dFs2XSA9IGl0dFs3XSA9IDE2OyAvLyBYWFg6IGNoZWNrIHRoYXQKKyAgICAgICAgICAgIGlmIChjLT5yYXN0ZXJpemVyLnN0YXRlLnRleHR1cmVbaV0uc193cmFwID09IEdHTF9DTEFNUCkgeworICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IGMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlLT5zdXJmYWNlLndpZHRoOworICAgICAgICAgICAgICAgIGl0dFswXSA9IHYtPnRleHR1cmVbaV0uUyAqIHdpZHRoOworICAgICAgICAgICAgICAgIGl0dFs2XSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYy0+cmFzdGVyaXplci5zdGF0ZS50ZXh0dXJlW2ldLnRfd3JhcCA9PSBHR0xfQ0xBTVApIHsKKyAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gYy0+dGV4dHVyZXMudG11W2ldLnRleHR1cmUtPnN1cmZhY2UuaGVpZ2h0OworICAgICAgICAgICAgICAgIGl0dFszXSA9IHYtPnRleHR1cmVbaV0uVCAqIGhlaWdodDsKKyAgICAgICAgICAgICAgICBpdHRbN10gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhDb29yZEdyYWRTY2FsZTh4dihjLCBpLCBpdHQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9ERVBUSF9URVNUKSB7CisgICAgICAgIGludDMyX3QgaXR6WzNdOworICAgICAgICBpdHpbMF0gPSBjbGFtcFoodi0+d2luZG93LnopICogMHgwMDAxMDAwMTsKKyAgICAgICAgaXR6WzFdID0gaXR6WzJdID0gMDsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy56R3JhZDN4dihjLCBpdHopOworICAgIH0KKworICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9GT0cpIHsKKyAgICAgICAgR0xmaXhlZCBpdGZbM107CisgICAgICAgIGl0ZlswXSA9IHYtPmZvZzsKKyAgICAgICAgaXRmWzFdID0gaXRmWzJdID0gMDsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5mb2dHcmFkM3h2KGMsIGl0Zik7CisgICAgfQorCisgICAgLy8gUmVuZGVyIG91ciBwb2ludC4uLgorICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MucG9pbnR4KGMsIHYtPndpbmRvdy52LCBjLT5wb2ludC5zaXplKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgTGluZQorI2VuZGlmCisKK3ZvaWQgcHJpbWl0aXZlX25vcF9saW5lKG9nbGVzX2NvbnRleHRfdCosIHZlcnRleF90KiwgdmVydGV4X3QqKSB7Cit9CisKK3ZvaWQgcHJpbWl0aXZlX2xpbmUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSkKK3sKKyAgICAvLyBnZXQgdGV4dHVyZSBjb29yZGluYXRlcworICAgIGZldGNoX3RleGNvb3JkKGMsIHYwLCB2MSwgdjEpOworCisgICAgLy8gbGlnaHQvc2hhZGUgdGhlIHZlcnRpY2VzIGZpcnN0ICh0aGV5J3JlIGNvcGllZCBiZWxvdykKKyAgICBjLT5saWdodGluZy5saWdodFRyaWFuZ2xlKGMsIHYwLCB2MSwgdjEpOworCisgICAgLy8gY2xpcCB0aGUgbGluZSBpZiBuZWVkZWQKKyAgICBpZiAoZ2dsX3VubGlrZWx5KCh2MC0+ZmxhZ3MgfCB2MS0+ZmxhZ3MpICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkgeworICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQgPSBjbGlwX2xpbmUoYywgdjAsIHYxKTsKKyAgICAgICAgaWYgKGdnbF91bmxpa2VseShjb3VudCA9PSAwKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBjb21wdXRlIGl0ZXJhdG9ycy4uLgorICAgIGNvbnN0IHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7CisgICAgY29uc3QgdWludDMyX3QgbWFzayA9ICAgR0dMX0VOQUJMRV9UTVVTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHR0xfRU5BQkxFX1NNT09USCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0dMX0VOQUJMRV9XIHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0dMX0VOQUJMRV9GT0cgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdHTF9FTkFCTEVfREVQVEhfVEVTVDsKKworICAgIGlmIChnZ2xfdW5saWtlbHkoZW5hYmxlcyAmIG1hc2spKSB7CisgICAgICAgIGMtPmxlcnAuaW5pdExpbmUodjAsIHYxKTsKKyAgICAgICAgbGVycF90cmlhbmdsZShjLCB2MCwgdjEsIHYwKTsKKyAgICB9CisKKyAgICAvLyByZW5kZXIgb3VyIGxpbmUKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmxpbmV4KGMsIHYwLT53aW5kb3cudiwgdjEtPndpbmRvdy52LCBjLT5saW5lLndpZHRoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgVHJpYW5nbGUKKyNlbmRpZgorCit2b2lkIHByaW1pdGl2ZV9ub3BfdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKSB7Cit9CisKK3ZvaWQgcHJpbWl0aXZlX2NsaXBfdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQoreworICAgIHVpbnQzMl90IGNjID0gKHYwLT5mbGFncyB8IHYxLT5mbGFncyB8IHYyLT5mbGFncykgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEw7CisgICAgaWYgKGdnbF9saWtlbHkoIWNjKSkgeworICAgICAgICAvLyBjb2RlIGJlbG93IG11c3QgYmUgYXMgb3B0aW1pemVkIGFzIHBvc3NpYmxlLCB0aGlzIGlzIHRoZQorICAgICAgICAvLyBjb21tb24gY29kZSBwYXRoLgorCisgICAgICAgIC8vIFRoaXMgdHJpYW5nbGUgaXMgbm90IGNsaXBwZWQsIHRlc3QgaWYgaXQncyBjdWxsZWQKKyAgICAgICAgLy8gdW5jbGlwcGVkIHRyaWFuZ2xlLi4uCisgICAgICAgIGMtPmxlcnAuaW5pdFRyaWFuZ2xlKHYwLCB2MSwgdjIpOworICAgICAgICBpZiAoY3VsbF90cmlhbmdsZShjLCB2MCwgdjEsIHYyKSkKKyAgICAgICAgICAgIHJldHVybjsgLy8gY3VsbGVkIQorCisgICAgICAgIC8vIEZldGNoIGFsbCB0ZXh0dXJlIGNvb3JkaW5hdGVzIGlmIG5lZWRlZAorICAgICAgICBmZXRjaF90ZXhjb29yZChjLCB2MCwgdjEsIHYyKTsKKworICAgICAgICAvLyBsaWdodCAob3Igc2hhZGUpIG91ciB0cmlhbmdsZSEKKyAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRUcmlhbmdsZShjLCB2MCwgdjEsIHYyKTsKKworICAgICAgICB0cmlhbmdsZShjLCB2MCwgdjEsIHYyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB3ZSdyZSBub3QgZ29pbmcgdG8gY2xpcCB2ZXJ5IG9mdGVuLAorICAgIC8vIGFuZCBldmVuIG1vcmUgcmFyZWx5IHdpbGwgd2UgY2xpcCBhIHRyaWFuZ2xlIHRoYXQgZW5kcyB1cAorICAgIC8vIGJlaW5nIGN1bGxlZCBvdXQuIFNvIGl0J3Mgb2theSB0byBsaWdodCB0aGUgdmVydGljZXMgaGVyZSwgZXZlbiB0aG91Z2gKKyAgICAvLyBpbiBhIGZldyBjYXNlcyB3ZSB3b24ndCByZW5kZXIgdGhlIHRyaWFuZ2xlIChpZiBjdWxsZWQpLgorCisgICAgLy8gRmV0Y2ggdGV4dHVyZSBjb29yZGluYXRlcy4uLgorICAgIGZldGNoX3RleGNvb3JkKGMsIHYwLCB2MSwgdjIpOworCisgICAgLy8gbGlnaHQgKG9yIHNoYWRlKSBvdXIgdHJpYW5nbGUhCisgICAgYy0+bGlnaHRpbmcubGlnaHRUcmlhbmdsZShjLCB2MCwgdjEsIHYyKTsKKworICAgIGNsaXBfdHJpYW5nbGUoYywgdjAsIHYxLCB2Mik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQoreworICAgIC8vIGNvbXB1dGUgaXRlcmF0b3JzLi4uCisgICAgY29uc3QgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKKyAgICBjb25zdCB1aW50MzJfdCBtYXNrID0gICBHR0xfRU5BQkxFX1RNVVMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdHTF9FTkFCTEVfU01PT1RIIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHR0xfRU5BQkxFX1cgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHR0xfRU5BQkxFX0ZPRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0dMX0VOQUJMRV9ERVBUSF9URVNUOworCisgICAgaWYgKGdnbF9saWtlbHkoZW5hYmxlcyAmIG1hc2spKQorICAgICAgICBsZXJwX3RyaWFuZ2xlKGMsIHYwLCB2MSwgdjIpOworCisgICAgYy0+cmFzdGVyaXplci5wcm9jcy50cmlhbmdsZXgoYywgdjAtPndpbmRvdy52LCB2MS0+d2luZG93LnYsIHYyLT53aW5kb3cudik7Cit9CisKK3ZvaWQgbGVycF90cmlhbmdsZShvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgY29uc3QgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKKyAgICBjLT5sZXJwLmluaXRMZXJwKHYwLCBlbmFibGVzKTsKKworICAgIC8vIHNldCB1cCB0ZXh0dXJlIGl0ZXJhdG9ycworICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9UTVVTKSB7CisgICAgICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9XKSB7CisgICAgICAgICAgICBsZXJwX3RleGNvb3Jkc193KGMsIHYwLCB2MSwgdjIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVycF90ZXhjb29yZHMoYywgdjAsIHYxLCB2Mik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzZXQgdXAgdGhlIGNvbG9yIGl0ZXJhdG9ycworICAgIGNvbnN0IGNvbXB1dGVfaXRlcmF0b3JzX3QmIGxlcnAgPSBjLT5sZXJwOworICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9TTU9PVEgpIHsKKyAgICAgICAgR0xmaXhlZCBpdGNbMTJdOworICAgICAgICBmb3IgKGludCBpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IEdHTGNvbG9yIGMwID0gdjAtPmNvbG9yLnZbaV0gKiAyNTU7CisgICAgICAgICAgICBjb25zdCBHR0xjb2xvciBjMSA9IHYxLT5jb2xvci52W2ldICogMjU1OworICAgICAgICAgICAgY29uc3QgR0dMY29sb3IgYzIgPSB2Mi0+Y29sb3IudltpXSAqIDI1NTsKKyAgICAgICAgICAgIGxlcnAuaXRlcmF0b3JzMTYxNigmaXRjW2kqM10sIGMwLCBjMSwgYzIpOworICAgICAgICB9CisgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3JHcmFkMTJ4dihjLCBpdGMpOworICAgIH0KKworICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9ERVBUSF9URVNUKSB7CisgICAgICAgIGludDMyX3QgaXR6WzNdOworICAgICAgICBjb25zdCBpbnQzMl90IHYweiA9IGNsYW1wWih2MC0+d2luZG93LnopOworICAgICAgICBjb25zdCBpbnQzMl90IHYxeiA9IGNsYW1wWih2MS0+d2luZG93LnopOworICAgICAgICBjb25zdCBpbnQzMl90IHYyeiA9IGNsYW1wWih2Mi0+d2luZG93LnopOworICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KGMtPnBvbHlnb25PZmZzZXQuZW5hYmxlKSkgeworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB1bml0cyA9IChjLT5wb2x5Z29uT2Zmc2V0LnVuaXRzIDw8IDE2KTsKKyAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgZmFjdG9yID0gYy0+cG9seWdvbk9mZnNldC5mYWN0b3I7CisgICAgICAgICAgICBpZiAoZmFjdG9yKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBpdHo2NFszXTsKKyAgICAgICAgICAgICAgICBsZXJwLml0ZXJhdG9yczAwMzIoaXR6NjQsIHYweiwgdjF6LCB2MnopOworICAgICAgICAgICAgICAgIGludDY0X3QgbWF4RGVwdGhTbG9wZSA9IG1heChpdHo2NFsxXSwgaXR6NjRbMl0pOworICAgICAgICAgICAgICAgIGl0elswXSA9IHVpbnQzMl90KGl0ejY0WzBdKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdWludDMyX3QoKG1heERlcHRoU2xvcGUqZmFjdG9yKT4+MTYpICsgdW5pdHM7CisgICAgICAgICAgICAgICAgaXR6WzFdID0gdWludDMyX3QoaXR6NjRbMV0pOworICAgICAgICAgICAgICAgIGl0elsyXSA9IHVpbnQzMl90KGl0ejY0WzJdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGVycC5pdGVyYXRvcnMwMDMyKGl0eiwgdjB6LCB2MXosIHYyeik7CisgICAgICAgICAgICAgICAgaXR6WzBdICs9IHVuaXRzOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlcnAuaXRlcmF0b3JzMDAzMihpdHosIHYweiwgdjF6LCB2MnopOworICAgICAgICB9CisgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuekdyYWQzeHYoYywgaXR6KTsKKyAgICB9ICAgIAorCisgICAgaWYgKGdnbF91bmxpa2VseShlbmFibGVzICYgR0dMX0VOQUJMRV9GT0cpKSB7CisgICAgICAgIEdMZml4ZWQgaXRmWzNdOworICAgICAgICBsZXJwLml0ZXJhdG9yczE2MTYoaXRmLCB2MC0+Zm9nLCB2MS0+Zm9nLCB2Mi0+Zm9nKTsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5mb2dHcmFkM3h2KGMsIGl0Zik7CisgICAgfQorfQorCisKK3N0YXRpYyBpbmxpbmUKK2ludCBjb21wdXRlX2xvZChvZ2xlc19jb250ZXh0X3QqIGMsIGludCBpLAorICAgICAgICBpbnQzMl90IHMwLCBpbnQzMl90IHQwLCBpbnQzMl90IHMxLCBpbnQzMl90IHQxLCBpbnQzMl90IHMyLCBpbnQzMl90IHQyKQoreworICAgIC8vIENvbXB1dGUgbWlwbWFwIGxldmVsIC8gcHJpbWl0aXZlCisgICAgLy8gcmhvID0gc3FydCggdGV4ZWxBcmVhIC8gYXJlYSApCisgICAgLy8gbG9kID0gbG9nMiggcmhvICkKKyAgICAvLyBsb2QgPSBsb2cyKCB0ZXhlbEFyZWEgLyBhcmVhICkgLyAyCisgICAgLy8gbG9kID0gKGxvZzIoIHRleGVsQXJlYSApIC0gbG9nMiggYXJlYSApKSAvIDIKKyAgICBjb25zdCBjb21wdXRlX2l0ZXJhdG9yc190JiBsZXJwID0gYy0+bGVycDsKKyAgICBjb25zdCBHR0xjb29yZCBhcmVhID0gYWJzKGxlcnAuYXJlYSgpKTsKKyAgICBjb25zdCBpbnQgdyA9IGMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlLT5zdXJmYWNlLndpZHRoOworICAgIGNvbnN0IGludCBoID0gYy0+dGV4dHVyZXMudG11W2ldLnRleHR1cmUtPnN1cmZhY2UuaGVpZ2h0OworICAgIGNvbnN0IGludCBzaGlmdCA9IDE2ICsgKDE2IC0gVFJJX0ZSQUNUSU9OX0JJVFMpOworICAgIGludDMyX3QgdGV4ZWxBcmVhID0gYWJzKCBnZ2xNdWx4KHMxLXMwLCB0Mi10MCwgc2hpZnQpIC0KKyAgICAgICAgICAgIGdnbE11bHgoczItczAsIHQxLXQwLCBzaGlmdCkgKSp3Kmg7CisgICAgaW50IGxvZzJUQXJlYSA9ICgzMi1UUklfRlJBQ1RJT05fQklUUyAgLTEpIC0gZ2dsQ2x6KHRleGVsQXJlYSk7CisgICAgaW50IGxvZzJBcmVhICA9ICgzMi1UUklfRlJBQ1RJT05fQklUUyoyLTEpIC0gZ2dsQ2x6KGFyZWEpOworICAgIGludCBsb2QgPSAobG9nMlRBcmVhIC0gbG9nMkFyZWEgKyAxKSA+PiAxOworICAgIHJldHVybiBsb2Q7Cit9CisKK3ZvaWQgbGVycF90ZXhjb29yZHMob2dsZXNfY29udGV4dF90KiBjLAorICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQoreworICAgIGNvbnN0IGNvbXB1dGVfaXRlcmF0b3JzX3QmIGxlcnAgPSBjLT5sZXJwOworICAgIGludDMyX3QgaXR0WzhdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSk7CisgICAgZm9yIChpbnQgaT0wIDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKSB7CisgICAgICAgIGNvbnN0IHRleHR1cmVfdCYgdG11ID0gYy0+cmFzdGVyaXplci5zdGF0ZS50ZXh0dXJlW2ldOworICAgICAgICBpZiAoIXRtdS5lbmFibGUpIAorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gY29tcHV0ZSB0aGUgamFjb2JpYW5zIHVzaW5nIGJsb2NrIGZsb2F0aW5nLXBvaW50CisgICAgICAgIGludDMyX3QgczAgPSB2MC0+dGV4dHVyZVtpXS5TOworICAgICAgICBpbnQzMl90IHQwID0gdjAtPnRleHR1cmVbaV0uVDsKKyAgICAgICAgaW50MzJfdCBzMSA9IHYxLT50ZXh0dXJlW2ldLlM7CisgICAgICAgIGludDMyX3QgdDEgPSB2MS0+dGV4dHVyZVtpXS5UOworICAgICAgICBpbnQzMl90IHMyID0gdjItPnRleHR1cmVbaV0uUzsKKyAgICAgICAgaW50MzJfdCB0MiA9IHYyLT50ZXh0dXJlW2ldLlQ7CisKKyAgICAgICAgY29uc3QgR0xlbnVtIG1pbl9maWx0ZXIgPSBjLT50ZXh0dXJlcy50bXVbaV0udGV4dHVyZS0+bWluX2ZpbHRlcjsKKyAgICAgICAgaWYgKGdnbF91bmxpa2VseShtaW5fZmlsdGVyID49IEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QpKSB7CisgICAgICAgICAgICBpbnQgbG9kID0gY29tcHV0ZV9sb2QoYywgaSwgczAsIHQwLCBzMSwgdDEsIHMyLCB0Mik7CisgICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmJpbmRUZXh0dXJlTG9kKGMsIGksCisgICAgICAgICAgICAgICAgICAgICZjLT50ZXh0dXJlcy50bXVbaV0udGV4dHVyZS0+bWlwKGxvZCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJlbXVsdGlwbHkgKHMsdCkgd2hlbiBjbGFtcGxpbmcKKyAgICAgICAgaWYgKHRtdS5zX3dyYXAgPT0gR0dMX0NMQU1QKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgd2lkdGggPSB0bXUuc3VyZmFjZS53aWR0aDsKKyAgICAgICAgICAgIHMwICo9IHdpZHRoOworICAgICAgICAgICAgczEgKj0gd2lkdGg7CisgICAgICAgICAgICBzMiAqPSB3aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAodG11LnRfd3JhcCA9PSBHR0xfQ0xBTVApIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBoZWlnaHQgPSB0bXUuc3VyZmFjZS5oZWlnaHQ7CisgICAgICAgICAgICB0MCAqPSBoZWlnaHQ7CisgICAgICAgICAgICB0MSAqPSBoZWlnaHQ7CisgICAgICAgICAgICB0MiAqPSBoZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgaXR0WzZdID0gLWxlcnAuaXRlcmF0b3JzU2NhbGUoaXR0KzAsIHMwLCBzMSwgczIpOworICAgICAgICBpdHRbN10gPSAtbGVycC5pdGVyYXRvcnNTY2FsZShpdHQrMywgdDAsIHQxLCB0Mik7CisgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4Q29vcmRHcmFkU2NhbGU4eHYoYywgaSwgaXR0KTsKKyAgICB9Cit9CisKK3ZvaWQgbGVycF90ZXhjb29yZHNfdyhvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgY29uc3QgY29tcHV0ZV9pdGVyYXRvcnNfdCYgbGVycCA9IGMtPmxlcnA7CisgICAgaW50MzJfdCBpdHRbOF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKTsKKyAgICBpbnQzMl90IGl0d1szXTsKKworICAgIC8vIGNvbXB1dGUgVydzIHNjYWxlIHRvIDIuMzAKKyAgICBpbnQzMl90IHcwID0gdjAtPndpbmRvdy53OworICAgIGludDMyX3QgdzEgPSB2MS0+d2luZG93Lnc7CisgICAgaW50MzJfdCB3MiA9IHYyLT53aW5kb3cudzsKKyAgICBpbnQgd3NjYWxlID0gMzIgLSBnZ2xDbHoodzB8dzF8dzIpOworCisgICAgLy8gY29tcHV0ZSB0aGUgamFjb2JpYW4gdXNpbmcgYmxvY2sgZmxvYXRpbmctcG9pbnQgICAgCisgICAgaW50IHNjID0gbGVycC5pdGVyYXRvcnNTY2FsZShpdHcsIHcwLCB3MSwgdzIpOworICAgIHNjICs9ICB3c2NhbGUgLSAxNjsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLndHcmFkM3h2KGMsIGl0dyk7CisKKyAgICBmb3IgKGludCBpPTAgOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKKyAgICAgICAgY29uc3QgdGV4dHVyZV90JiB0bXUgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLnRleHR1cmVbaV07CisgICAgICAgIGlmICghdG11LmVuYWJsZSkgCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBjb21wdXRlIHRoZSBqYWNvYmlhbnMgdXNpbmcgYmxvY2sgZmxvYXRpbmctcG9pbnQKKyAgICAgICAgaW50MzJfdCBzMCA9IHYwLT50ZXh0dXJlW2ldLlM7CisgICAgICAgIGludDMyX3QgdDAgPSB2MC0+dGV4dHVyZVtpXS5UOworICAgICAgICBpbnQzMl90IHMxID0gdjEtPnRleHR1cmVbaV0uUzsKKyAgICAgICAgaW50MzJfdCB0MSA9IHYxLT50ZXh0dXJlW2ldLlQ7CisgICAgICAgIGludDMyX3QgczIgPSB2Mi0+dGV4dHVyZVtpXS5TOworICAgICAgICBpbnQzMl90IHQyID0gdjItPnRleHR1cmVbaV0uVDsKKworICAgICAgICBjb25zdCBHTGVudW0gbWluX2ZpbHRlciA9IGMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlLT5taW5fZmlsdGVyOworICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KG1pbl9maWx0ZXIgPj0gR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCkpIHsKKyAgICAgICAgICAgIGludCBsb2QgPSBjb21wdXRlX2xvZChjLCBpLCBzMCwgdDAsIHMxLCB0MSwgczIsIHQyKTsKKyAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYmluZFRleHR1cmVMb2QoYywgaSwKKyAgICAgICAgICAgICAgICAgICAgJmMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlLT5taXAobG9kKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcmVtdWx0aXBseSAocyx0KSB3aGVuIGNsYW1wbGluZworICAgICAgICBpZiAodG11LnNfd3JhcCA9PSBHR0xfQ0xBTVApIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB3aWR0aCA9IHRtdS5zdXJmYWNlLndpZHRoOworICAgICAgICAgICAgczAgKj0gd2lkdGg7CisgICAgICAgICAgICBzMSAqPSB3aWR0aDsKKyAgICAgICAgICAgIHMyICo9IHdpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICh0bXUudF93cmFwID09IEdHTF9DTEFNUCkgeworICAgICAgICAgICAgY29uc3QgaW50IGhlaWdodCA9IHRtdS5zdXJmYWNlLmhlaWdodDsKKyAgICAgICAgICAgIHQwICo9IGhlaWdodDsKKyAgICAgICAgICAgIHQxICo9IGhlaWdodDsKKyAgICAgICAgICAgIHQyICo9IGhlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIHMwID0gZ2dsTXVseChzMCwgdzAsIHdzY2FsZSk7CisgICAgICAgIHQwID0gZ2dsTXVseCh0MCwgdzAsIHdzY2FsZSk7CisgICAgICAgIHMxID0gZ2dsTXVseChzMSwgdzEsIHdzY2FsZSk7CisgICAgICAgIHQxID0gZ2dsTXVseCh0MSwgdzEsIHdzY2FsZSk7CisgICAgICAgIHMyID0gZ2dsTXVseChzMiwgdzIsIHdzY2FsZSk7CisgICAgICAgIHQyID0gZ2dsTXVseCh0MiwgdzIsIHdzY2FsZSk7CisKKyAgICAgICAgaXR0WzZdID0gc2MgLSBsZXJwLml0ZXJhdG9yc1NjYWxlKGl0dCswLCBzMCwgczEsIHMyKTsKKyAgICAgICAgaXR0WzddID0gc2MgLSBsZXJwLml0ZXJhdG9yc1NjYWxlKGl0dCszLCB0MCwgdDEsIHQyKTsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhDb29yZEdyYWRTY2FsZTh4dihjLCBpLCBpdHQpOworICAgIH0KK30KKworCitzdGF0aWMgaW5saW5lCitib29sIGN1bGxfdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQoreworICAgIGlmIChnZ2xfbGlrZWx5KGMtPmN1bGwuZW5hYmxlKSkgeworICAgICAgICBjb25zdCBHTGVudW0gd2luZGluZyA9IChjLT5sZXJwLmFyZWEoKSA+IDApID8gR0xfQ1cgOiBHTF9DQ1c7CisgICAgICAgIGNvbnN0IEdMZW51bSBmYWNlID0gKHdpbmRpbmcgPT0gYy0+Y3VsbC5mcm9udEZhY2UpID8gR0xfRlJPTlQgOiBHTF9CQUNLOworICAgICAgICBpZiAoZmFjZSA9PSBjLT5jdWxsLmN1bGxGYWNlKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGN1bGxlZCEKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lCitHTGZpeGVkIGZydXN0dW1QbGFuZURpc3QoaW50IHBsYW5lLCBjb25zdCB2ZWM0X3QmIHMpCit7CisgICAgY29uc3QgR0xmaXhlZCBkID0gcy52WyBwbGFuZSA+PiAxIF07CisgICAgcmV0dXJuICAoKHBsYW5lICYgMSkgPyAocy53IC0gZCkgOiAocy53ICsgZCkpOyAKK30KKworc3RhdGljIGlubGluZQoraW50MzJfdCBjbGlwRGl2aWRlKEdMZml4ZWQgYSwgR0xmaXhlZCBiKSB7CisgICAgLy8gcmV0dXJucyBhIDQuMjggZml4ZWQtcG9pbnQKKyAgICByZXR1cm4gZ2dsTXVsRGl2aSgxTFU8PDI4LCBhLCBiKTsKK30gCisKK3ZvaWQgY2xpcF90cmlhbmdsZShvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCit7CisgICAgdWludDMyX3QgYWxsX2NjID0gKHYwLT5mbGFncyB8IHYxLT5mbGFncyB8IHYyLT5mbGFncykgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEw7CisKKyAgICB2ZXJ0ZXhfdCAqcDAsICpwMSwgKnAyOworICAgIGNvbnN0IGludCBNQVhfQ0xJUFBJTkdfUExBTkVTID0gNiArIE9HTEVTX01BWF9DTElQX1BMQU5FUzsKKyAgICBjb25zdCBpbnQgTUFYX1ZFUlRJQ0VTID0gMzsKKworICAgIC8vIFRlbXBvcmFyeSBidWZmZXIgdG8gaG9sZCB0aGUgbmV3IHZlcnRpY2VzLiBFYWNoIHBsYW5lIGNhbiBhZGQgdXAgdG8gCisgICAgLy8gdHdvIG5ldyB2ZXJ0aWNlcyAoYmVjYXVzZSB0aGUgcG9seWdvbiBpcyBjb252ZXgpLgorICAgIC8vIFdlIG5lZWQgb25lIGV4dHJhIGVsZW1lbnQsIHRvIGhhbmRsZSBhbiBvdmVyZmxvdyBjYXNlIHdoZW4KKyAgICAvLyB0aGUgcG9seWdvbiBkZWdlbmVyYXRlcyBpbnRvIHNvbWV0aGluZyBub24gY29udmV4LgorICAgIHZlcnRleF90IGJ1ZmZlcltNQVhfQ0xJUFBJTkdfUExBTkVTICogMiArIDFdOyAgIC8vIH4zS0IKKyAgICB2ZXJ0ZXhfdCogYnVmID0gYnVmZmVyOworCisgICAgLy8gb3JpZ2luYWwgbGlzdCBvZiB2ZXJ0aWNlcyAocG9seWdvbiB0byBjbGlwLCBpbiBmYWN0IHRoaXMKKyAgICAvLyBmdW5jdGlvbiB3b3JrcyB3aXRoIGFuIGFyYml0cmFyeSBwb2x5Z29uKS4KKyAgICB2ZXJ0ZXhfdCogaW5bM10gPSB7IHYwLCB2MSwgdjIgfTsKKyAgICAKKyAgICAvLyBvdXRwdXQgbGlzdHMgKHdlIG5lZWQgMiwgd2hpY2ggd2UgdXNlIGJhY2sgYW5kIGZvcnRoKQorICAgIC8vIChtYXhpbXVtIG91dHBvdXQgbGlzdCdzIHNpemUgaXMgTUFYX0NMSVBQSU5HX1BMQU5FUyArIE1BWF9WRVJUSUNFUykKKyAgICAvLyAyIG1vcmUgZWxlbWVudHMgZm9yIG92ZXJmbG93IHdoZW4gbm9uIGNvbnZleCBwb2x5Z29ucy4KKyAgICB2ZXJ0ZXhfdCogb3V0WzJdW01BWF9DTElQUElOR19QTEFORVMgKyBNQVhfVkVSVElDRVMgKyAyXTsKKyAgICB1bnNpZ25lZCBpbnQgb3V0aSA9IDA7CisgICAgCisgICAgLy8gY3VycmVudCBpbnB1dCBsaXN0CisgICAgdmVydGV4X3QqKiBpdmwgPSBpbjsKKworICAgIC8vIDMgaW5wdXQgdmVydGljZXMsIDAgaW4gdGhlIG91dHB1dCBsaXN0LCBmaXJzdCBwbGFuZQorICAgIHVuc2lnbmVkIGludCBpYyA9IDM7CisKKyAgICAvLyBVc2VyIGNsaXAtcGxhbmVzIGZpcnN0LCB0aGUgY2xpcHBpbmcgaXMgYWx3YXlzIGRvbmUgaW4gZXllLWNvb3JkaW5hdGUKKyAgICAvLyB0aGlzIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhbGdvcml0aG0gdGhhbiBmb3IgdGhlIHZpZXctdm9sdW1lCisgICAgLy8gY2xpcHBpbmcsIGV4Y2VwdCBmb3IgdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBkaXN0YW5jZSAodmVydGV4LCBwbGFuZSkKKyAgICAvLyBhbmQgdGhlIGZhY3QgdGhhdCB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIGV5ZS1jb29yZGluYXRlcyBvZiBlYWNoCisgICAgLy8gbmV3IHZlcnRleCB3ZSBjcmVhdGUuCisgICAgCisgICAgaWYgKGdnbF91bmxpa2VseShhbGxfY2MgJiB2ZXJ0ZXhfdDo6VVNFUl9DTElQX0FMTCkpCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgcGxhbmUgPSAwOworICAgICAgICB1aW50MzJfdCBjYyA9IChhbGxfY2MgJiB2ZXJ0ZXhfdDo6VVNFUl9DTElQX0FMTCkgPj4gODsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKGNjICYgMSkgeyAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gcG9pbnRlcnMgdG8gb3VyIG91dHB1dCBsaXN0IChoZWFkIGFuZCBjdXJyZW50KQorICAgICAgICAgICAgICAgIHZlcnRleF90KiogY29uc3Qgb3ZsID0gJm91dFtvdXRpXVswXTsKKyAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCoqIG91dHB1dCA9IG92bDsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb2MgPSAwOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzZW50aW5lbCA9IDA7CisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdmVydGV4LCBjb21wdXRlIGRpc3RhbmNlIHRvIHRoZSBwbGFuZQorICAgICAgICAgICAgICAgIHZlcnRleF90KiBzID0gaXZsW2ljLTFdOworICAgICAgICAgICAgICAgIGNvbnN0IHZlYzRfdCYgZXF1YXRpb24gPSBjLT5jbGlwUGxhbmVzLnBsYW5lW3BsYW5lXS5lcXVhdGlvbjsKKyAgICAgICAgICAgICAgICBHTGZpeGVkIHNkID0gZG90NChlcXVhdGlvbi52LCBzLT5leWUudik7CisgICAgICAgICAgICAgICAgLy8gY2xpcCBlYWNoIHZlcnRleCBhZ2FpbnN0IHRoaXMgcGxhbmUuLi4KKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpPTAgOyBpPGljIDsgaSsrKSB7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHZlcnRleF90KiBwID0gaXZsW2ldOworICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHBkID0gZG90NChlcXVhdGlvbi52LCBwLT5leWUudik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggaW5zaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCsrID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYysrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzIGluc2lkZSwgcCBvdXRzaWRlIChleGl0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgdCA9IGNsaXBEaXZpZGUoc2QsIHNkLXBkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMuY2xpcEV5ZShjLCBidWYsIHQsIHAsIHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQrKyA9IGJ1ZisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrc2VudGluZWwgPj0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBub24tY29udmV4IHBvbHlnb24hCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHMgb3V0c2lkZSAoZW50ZXJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgdCA9IGNsaXBEaXZpZGUocGQsIHBkLXNkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YXJyYXlzLmNsaXBFeWUoYywgYnVmLCB0LCBzLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCsrID0gYnVmKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK3NlbnRpbmVsID49IDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vbi1jb252ZXggcG9seWdvbiEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCsrID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYysrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggb3V0c2lkZQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHMgPSBwOworICAgICAgICAgICAgICAgICAgICBzZCA9IHBkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBvdXRwdXQgbGlzdCBiZWNvbWUgdGhlIG5ldyBpbnB1dCBsaXN0CisgICAgICAgICAgICAgICAgaWYgKG9jPDMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbGVzcyB0aGFuIDMgdmVydGljZXMgbGVmdD8gd2UncmUgZG9uZSEKKyAgICAgICAgICAgICAgICBpdmwgPSBvdmw7CisgICAgICAgICAgICAgICAgaWMgPSBvYzsKKyAgICAgICAgICAgICAgICBvdXRpID0gMS1vdXRpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2MgPj49IDE7CisgICAgICAgICAgICBwbGFuZSsrOworICAgICAgICB9IHdoaWxlIChjYyk7CisgICAgfQorCisgICAgLy8gZnJ1c3R1bSBjbGlwLXBsYW5lcworICAgIGlmIChhbGxfY2MgJiB2ZXJ0ZXhfdDo6RlJVU1RVTV9DTElQX0FMTCkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBwbGFuZSA9IDA7CisgICAgICAgIHVpbnQzMl90IGNjID0gYWxsX2NjICYgdmVydGV4X3Q6OkZSVVNUVU1fQ0xJUF9BTEw7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChjYyAmIDEpIHsgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIHBvaW50ZXJzIHRvIG91ciBvdXRwdXQgbGlzdCAoaGVhZCBhbmQgY3VycmVudCkKKyAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCoqIGNvbnN0IG92bCA9ICZvdXRbb3V0aV1bMF07CisgICAgICAgICAgICAgICAgdmVydGV4X3QqKiBvdXRwdXQgPSBvdmw7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9jID0gMDsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2VudGluZWwgPSAwOworICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHZlcnRleCwgY29tcHV0ZSBkaXN0YW5jZSB0byB0aGUgcGxhbmUKKyAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCogcyA9IGl2bFtpYy0xXTsKKyAgICAgICAgICAgICAgICBHTGZpeGVkIHNkID0gZnJ1c3R1bVBsYW5lRGlzdChwbGFuZSwgcy0+Y2xpcCk7CisgICAgICAgICAgICAgICAgLy8gY2xpcCBlYWNoIHZlcnRleCBhZ2FpbnN0IHRoaXMgcGxhbmUuLi4KKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpPTAgOyBpPGljIDsgaSsrKSB7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHZlcnRleF90KiBwID0gaXZsW2ldOworICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHBkID0gZnJ1c3R1bVBsYW5lRGlzdChwbGFuZSwgcC0+Y2xpcCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggaW5zaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCsrID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYysrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzIGluc2lkZSwgcCBvdXRzaWRlIChleGl0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgdCA9IGNsaXBEaXZpZGUoc2QsIHNkLXBkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMuY2xpcFZlcnRleChjLCBidWYsIHQsIHAsIHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQrKyA9IGJ1ZisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrc2VudGluZWwgPj0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBub24tY29udmV4IHBvbHlnb24hCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHMgb3V0c2lkZSAoZW50ZXJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgdCA9IGNsaXBEaXZpZGUocGQsIHBkLXNkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YXJyYXlzLmNsaXBWZXJ0ZXgoYywgYnVmLCB0LCBzLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCsrID0gYnVmKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK3NlbnRpbmVsID49IDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vbi1jb252ZXggcG9seWdvbiEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCsrID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYysrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggb3V0c2lkZQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHMgPSBwOworICAgICAgICAgICAgICAgICAgICBzZCA9IHBkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBvdXRwdXQgbGlzdCBiZWNvbWUgdGhlIG5ldyBpbnB1dCBsaXN0CisgICAgICAgICAgICAgICAgaWYgKG9jPDMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbGVzcyB0aGFuIDMgdmVydGljZXMgbGVmdD8gd2UncmUgZG9uZSEKKyAgICAgICAgICAgICAgICBpdmwgPSBvdmw7CisgICAgICAgICAgICAgICAgaWMgPSBvYzsKKyAgICAgICAgICAgICAgICBvdXRpID0gMS1vdXRpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2MgPj49IDE7CisgICAgICAgICAgICBwbGFuZSsrOworICAgICAgICB9IHdoaWxlIChjYyk7CisgICAgfQorICAgIAorICAgIC8vIGZpbmFsbHkgd2UgY2FuIHJlbmRlciBvdXIgdHJpYW5nbGVzLi4uCisgICAgcDAgPSBpdmxbMF07CisgICAgcDEgPSBpdmxbMV07CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0yIDsgaTxpYyA7IGkrKykgeworICAgICAgICBwMiA9IGl2bFtpXTsKKyAgICAgICAgYy0+bGVycC5pbml0VHJpYW5nbGUocDAsIHAxLCBwMik7CisgICAgICAgIGlmIChjdWxsX3RyaWFuZ2xlKGMsIHAwLCBwMSwgcDIpKSB7CisgICAgICAgICAgICBwMSA9IHAyOworICAgICAgICAgICAgY29udGludWU7IC8vIGN1bGxlZCEKKyAgICAgICAgfQorICAgICAgICB0cmlhbmdsZShjLCBwMCwgcDEsIHAyKTsKKyAgICAgICAgcDEgPSBwMjsKKyAgICB9Cit9CisKK3Vuc2lnbmVkIGludCBjbGlwX2xpbmUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogcywgdmVydGV4X3QqIHApCit7CisgICAgY29uc3QgdWludDMyX3QgYWxsX2NjID0gKHMtPmZsYWdzIHwgcC0+ZmxhZ3MpICYgdmVydGV4X3Q6OkNMSVBfQUxMOworCisgICAgaWYgKGdnbF91bmxpa2VseShhbGxfY2MgJiB2ZXJ0ZXhfdDo6VVNFUl9DTElQX0FMTCkpCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgcGxhbmUgPSAwOworICAgICAgICB1aW50MzJfdCBjYyA9IChhbGxfY2MgJiB2ZXJ0ZXhfdDo6VVNFUl9DTElQX0FMTCkgPj4gODsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKGNjICYgMSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHZlYzRfdCYgZXF1YXRpb24gPSBjLT5jbGlwUGxhbmVzLnBsYW5lW3BsYW5lXS5lcXVhdGlvbjsKKyAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHNkID0gZG90NChlcXVhdGlvbi52LCBzLT5leWUudik7CisgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCBwZCA9IGRvdDQoZXF1YXRpb24udiwgcC0+ZXllLnYpOworICAgICAgICAgICAgICAgIGlmIChzZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGluc2lkZQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcyBpbnNpZGUsIHAgb3V0c2lkZSAoZXhpdGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgdCA9IGNsaXBEaXZpZGUoc2QsIHNkLXBkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFycmF5cy5jbGlwRXllKGMsIHAsIHQsIHAsIHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBkID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHMgb3V0c2lkZSAoZW50ZXJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHQgPSBjbGlwRGl2aWRlKHBkLCBwZC1zZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YXJyYXlzLmNsaXBFeWUoYywgcywgdCwgcywgcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggb3V0c2lkZQorICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNjID4+PSAxOworICAgICAgICAgICAgcGxhbmUrKzsKKyAgICAgICAgfSB3aGlsZSAoY2MpOworICAgIH0KKworICAgIC8vIGZydXN0dW0gY2xpcC1wbGFuZXMKKyAgICBpZiAoYWxsX2NjICYgdmVydGV4X3Q6OkZSVVNUVU1fQ0xJUF9BTEwpCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgcGxhbmUgPSAwOworICAgICAgICB1aW50MzJfdCBjYyA9IGFsbF9jYyAmIHZlcnRleF90OjpGUlVTVFVNX0NMSVBfQUxMOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoY2MgJiAxKSB7CisgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCBzZCA9IGZydXN0dW1QbGFuZURpc3QocGxhbmUsIHMtPmNsaXApOworICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgcGQgPSBmcnVzdHVtUGxhbmVEaXN0KHBsYW5lLCBwLT5jbGlwKTsKKyAgICAgICAgICAgICAgICBpZiAoc2QgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBpbnNpZGUKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHMgaW5zaWRlLCBwIG91dHNpZGUgKGV4aXRpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHQgPSBjbGlwRGl2aWRlKHNkLCBzZC1wZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMuY2xpcFZlcnRleChjLCBwLCB0LCBwLCBzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzIG91dHNpZGUgKGVudGVyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCB0ID0gY2xpcERpdmlkZShwZCwgcGQtc2QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFycmF5cy5jbGlwVmVydGV4KGMsIHMsIHQsIHMsIHApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIG91dHNpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYyA+Pj0gMTsKKyAgICAgICAgICAgIHBsYW5lKys7CisgICAgICAgIH0gd2hpbGUgKGNjKTsKKyAgICB9CisKKyAgICByZXR1cm4gMjsKK30KKworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmggYi9vcGVuZ2wvbGliYWdsL3ByaW1pdGl2ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmVmNjA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmgKQEAgLTAsMCArMSwzNyBAQAorLyogbGlicy9vcGVuZ2xlcy9wcmltaXRpdmVzLmgKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfUFJJTUlUSVZFU19ICisjZGVmaW5lIEFORFJPSURfT1BFTkdMRVNfUFJJTUlUSVZFU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBnbCB7CitzdHJ1Y3Qgb2dsZXNfY29udGV4dF90OworfTsKKwordm9pZCBvZ2xlc192YWxpZGF0ZV9wcmltaXRpdmVzKG9nbGVzX2NvbnRleHRfdCogYyk7CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX1BSSU1JVElWRVNfSAorCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL3N0YXRlLmNwcCBiL29wZW5nbC9saWJhZ2wvc3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYmFiZWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL3N0YXRlLmNwcApAQCAtMCwwICsxLDU4NiBAQAorLyogbGlicy9vcGVuZ2xlcy9zdGF0ZS5jcHAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJjb250ZXh0LmgiCisjaW5jbHVkZSAiZnAuaCIKKyNpbmNsdWRlICJzdGF0ZS5oIgorI2luY2x1ZGUgImFycmF5LmgiCisjaW5jbHVkZSAibWF0cml4LmgiCisjaW5jbHVkZSAidmVydGV4LmgiCisjaW5jbHVkZSAibGlnaHQuaCIKKyNpbmNsdWRlICJ0ZXh0dXJlLmgiCisjaW5jbHVkZSAiQnVmZmVyT2JqZWN0TWFuYWdlci5oIgorI2luY2x1ZGUgIlRleHR1cmVPYmplY3RNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGdWZW5kb3JTdHJpbmcgICAgID0gIkFuZHJvaWQiOworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnUmVuZGVyZXJTdHJpbmcgICA9ICJBbmRyb2lkIFBpeGVsRmxpbmdlciAxLjAiOworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnVmVyc2lvblN0cmluZyAgICA9ICJPcGVuR0wgRVMtQ00gMS4wIjsKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ0V4dGVuc2lvbnNTdHJpbmcgPQorICAgICJHTF9PRVNfYnl0ZV9jb29yZGluYXRlcyAiICAgICAgICAgICAgICAvLyBPSworICAgICJHTF9PRVNfZml4ZWRfcG9pbnQgIiAgICAgICAgICAgICAgICAgICAvLyBPSworICAgICJHTF9PRVNfc2luZ2xlX3ByZWNpc2lvbiAiICAgICAgICAgICAgICAvLyBPSworICAgICJHTF9PRVNfcmVhZF9mb3JtYXQgIiAgICAgICAgICAgICAgICAgICAvLyBPSworICAgICJHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlICIgICAvLyBPSworICAgICJHTF9PRVNfZHJhd190ZXh0dXJlICIgICAgICAgICAgICAgICAgICAvLyBPSworICAgICJHTF9PRVNfbWF0cml4X2dldCAiICAgICAgICAgICAgICAgICAgICAvLyBPSworICAgICJHTF9PRVNfcXVlcnlfbWF0cml4ICIgICAgICAgICAgICAgICAgICAvLyBPSworICAgIC8vICAgICAgICAiR0xfT0VTX3BvaW50X3NpemVfYXJyYXkgIiAgICAgICAgICAgICAgLy8gVE9ETworICAgIC8vICAgICAgICAiR0xfT0VTX3BvaW50X3Nwcml0ZSAiICAgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICJHTF9BUkJfdGV4dHVyZV9jb21wcmVzc2lvbiAiICAgICAgICAgICAvLyBPSworICAgICJHTF9BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvICIgICAgICAvLyBPSworICAgICJHTF9BTkRST0lEX2RpcmVjdF90ZXh0dXJlICIgICAgICAgICAgICAvLyBPSworICAgICJHTF9BTkRST0lEX3VzZXJfY2xpcF9wbGFuZSAiICAgICAgICAgICAvLyBPSworICAgICJHTF9BTkRST0lEX3ZlcnRleF9idWZmZXJfb2JqZWN0ICIgICAgICAvLyBPSworICAgICJHTF9BTkRST0lEX2dlbmVyYXRlX21pcG1hcCAiICAgICAgICAgICAvLyBPSworICAgIDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjZW5kaWYKKworb2dsZXNfY29udGV4dF90ICpvZ2xlc19pbml0KHNpemVfdCBleHRyYSkKK3sKKyAgICB2b2lkKiBjb25zdCBiYXNlID0gbWFsbG9jKGV4dHJhICsgc2l6ZW9mKG9nbGVzX2NvbnRleHRfdCkgKyAzMik7CisJaWYgKCFiYXNlKSByZXR1cm4gMDsKKworICAgIG9nbGVzX2NvbnRleHRfdCAqYyA9CisgICAgICAgICAgICAob2dsZXNfY29udGV4dF90ICopKChwdHJkaWZmX3QoYmFzZSkgKyBleHRyYSArIDMxKSAmIH4weDFGTCk7CisgICAgbWVtc2V0KGMsIDAsIHNpemVvZihvZ2xlc19jb250ZXh0X3QpKTsKKyAgICBnZ2xfaW5pdF9jb250ZXh0KCYoYy0+cmFzdGVyaXplcikpOworICAgIAorICAgIC8vIFhYWDogdGhpcyBzaG91bGQgYmUgcGFzc2VkIGFzIGFuIGFyZ3VtZW50CisgICAgc3A8RUdMU3VyZmFjZU1hbmFnZXI+IHNtZ3IobmV3IEVHTFN1cmZhY2VNYW5hZ2VyKCkpOworICAgIGMtPnN1cmZhY2VNYW5hZ2VyID0gc21nci5nZXQoKTsKKyAgICBjLT5zdXJmYWNlTWFuYWdlci0+aW5jU3Ryb25nKGMpOworCisgICAgc3A8RUdMQnVmZmVyT2JqZWN0TWFuYWdlcj4gYm9tZ3IobmV3IEVHTEJ1ZmZlck9iamVjdE1hbmFnZXIoKSk7CisgICAgYy0+YnVmZmVyT2JqZWN0TWFuYWdlciA9IGJvbWdyLmdldCgpOworICAgIGMtPmJ1ZmZlck9iamVjdE1hbmFnZXItPmluY1N0cm9uZyhjKTsKKworICAgIG9nbGVzX2luaXRfYXJyYXkoYyk7CisgICAgb2dsZXNfaW5pdF9tYXRyaXgoYyk7CisgICAgb2dsZXNfaW5pdF92ZXJ0ZXgoYyk7CisgICAgb2dsZXNfaW5pdF9saWdodChjKTsKKyAgICBvZ2xlc19pbml0X3RleHR1cmUoYyk7CisKKyAgICBjLT5yYXN0ZXJpemVyLmJhc2UgPSBiYXNlOworICAgIGMtPnBvaW50LnNpemUgPSBUUklfT05FOworICAgIGMtPmxpbmUud2lkdGggPSBUUklfT05FOworICAgICAgICAgICAgCisgICAgLy8gaW4gT3BlbkdMLCB3cml0aW5nIHRvIHRoZSBkZXB0aCBidWZmZXIgaXMgZW5hYmxlZCBieSBkZWZhdWx0LgorICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZGVwdGhNYXNrKGMsIDEpOworICAgIAorICAgIC8vIE9wZW5HTCBlbmFibGVzIGRpdGhlcmluZyBieSBkZWZhdWx0CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5lbmFibGUoYywgR0xfRElUSEVSKTsKKworICAgIHJldHVybiBjOworfQorCit2b2lkIG9nbGVzX3VuaW5pdChvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgb2dsZXNfdW5pbml0X2FycmF5KGMpOworICAgIG9nbGVzX3VuaW5pdF9tYXRyaXgoYyk7CisgICAgb2dsZXNfdW5pbml0X3ZlcnRleChjKTsKKyAgICBvZ2xlc191bmluaXRfbGlnaHQoYyk7CisgICAgb2dsZXNfdW5pbml0X3RleHR1cmUoYyk7CisgICAgYy0+c3VyZmFjZU1hbmFnZXItPmRlY1N0cm9uZyhjKTsKKyAgICBjLT5idWZmZXJPYmplY3RNYW5hZ2VyLT5kZWNTdHJvbmcoYyk7CisgICAgZ2dsX3VuaW5pdF9jb250ZXh0KCYoYy0+cmFzdGVyaXplcikpOworCWZyZWUoYy0+cmFzdGVyaXplci5iYXNlKTsKK30KKwordm9pZCBfb2dsZXNfZXJyb3Iob2dsZXNfY29udGV4dF90KiBjLCBHTGVudW0gZXJyb3IpCit7CisgICAgaWYgKGMtPmVycm9yID09IEdMX05PX0VSUk9SKQorICAgICAgICBjLT5lcnJvciA9IGVycm9yOworfQorCitzdGF0aWMgYm9vbCBzdGVuY2lsb3BfdmFsaWQoR0xlbnVtIG9wKSB7CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgR0xfS0VFUDoKKyAgICBjYXNlIEdMX1pFUk86CisgICAgY2FzZSBHTF9SRVBMQUNFOgorICAgIGNhc2UgR0xfSU5DUjoKKyAgICBjYXNlIEdMX0RFQ1I6CisgICAgY2FzZSBHTF9JTlZFUlQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9kaXNhYmxlKG9nbGVzX2NvbnRleHRfdCogYywgR0xlbnVtIGNhcCwgaW50IGVuYWJsZWQpCit7CisgICAgaWYgKChjYXAgPj0gR0xfTElHSFQwKSAmJiAoY2FwPEdMX0xJR0hUMCtPR0xFU19NQVhfTElHSFRTKSkgeworICAgICAgICBjLT5saWdodGluZy5saWdodHNbY2FwLUdMX0xJR0hUMF0uZW5hYmxlID0gZW5hYmxlZDsKKyAgICAgICAgYy0+bGlnaHRpbmcuZW5hYmxlZExpZ2h0cyAmPSB+KDE8PChjYXAtR0xfTElHSFQwKSk7CisgICAgICAgIGMtPmxpZ2h0aW5nLmVuYWJsZWRMaWdodHMgfD0gKGVuYWJsZWQ8PChjYXAtR0xfTElHSFQwKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNhcCkgeworICAgIGNhc2UgR0xfUE9JTlRfU01PT1RIOgorICAgICAgICBjLT5wb2ludC5zbW9vdGggPSBlbmFibGVkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0xJTkVfU01PT1RIOgorICAgICAgICBjLT5saW5lLnNtb290aCA9IGVuYWJsZWQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfUE9MWUdPTl9PRkZTRVRfRklMTDoKKyAgICAgICAgYy0+cG9seWdvbk9mZnNldC5lbmFibGUgPSBlbmFibGVkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0NVTExfRkFDRToKKyAgICAgICAgYy0+Y3VsbC5lbmFibGUgPSBlbmFibGVkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0xJR0hUSU5HOgorICAgICAgICBjLT5saWdodGluZy5lbmFibGUgPSBlbmFibGVkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0NPTE9SX01BVEVSSUFMOgorICAgICAgICBjLT5saWdodGluZy5jb2xvck1hdGVyaWFsLmVuYWJsZSA9IGVuYWJsZWQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfTk9STUFMSVpFOgorICAgIGNhc2UgR0xfUkVTQ0FMRV9OT1JNQUw6CisgICAgICAgIGMtPnRyYW5zZm9ybXMucmVzY2FsZU5vcm1hbHMgPSBlbmFibGVkID8gY2FwIDogMDsKKyAgICAgICAgLy8gWFhYOiBpbnZhbGlkYXRlIG12aXQKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdMX0NMSVBfUExBTkUwOgorICAgIGNhc2UgR0xfQ0xJUF9QTEFORTE6CisgICAgY2FzZSBHTF9DTElQX1BMQU5FMjoKKyAgICBjYXNlIEdMX0NMSVBfUExBTkUzOgorICAgIGNhc2UgR0xfQ0xJUF9QTEFORTQ6CisgICAgY2FzZSBHTF9DTElQX1BMQU5FNToKKyAgICAgICAgYy0+Y2xpcFBsYW5lcy5lbmFibGUgJj0gfigxPDwoY2FwLUdMX0NMSVBfUExBTkUwKSk7CisgICAgICAgIGMtPmNsaXBQbGFuZXMuZW5hYmxlIHw9IChlbmFibGVkPDwoY2FwLUdMX0NMSVBfUExBTkUwKSk7CisgICAgICAgIG9nbGVzX2ludmFsaWRhdGVfcGVyc3BlY3RpdmUoYyk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBHTF9GT0c6CisgICAgY2FzZSBHTF9ERVBUSF9URVNUOgorICAgICAgICBvZ2xlc19pbnZhbGlkYXRlX3BlcnNwZWN0aXZlKGMpOworICAgICAgICAvLyBmYWxsLXRocm91Z2guLi4KKyAgICBjYXNlIEdMX0JMRU5EOgorICAgIGNhc2UgR0xfU0NJU1NPUl9URVNUOgorICAgIGNhc2UgR0xfQUxQSEFfVEVTVDoKKyAgICBjYXNlIEdMX0NPTE9SX0xPR0lDX09QOgorICAgIGNhc2UgR0xfRElUSEVSOgorICAgIGNhc2UgR0xfU1RFTkNJTF9URVNUOgorICAgIGNhc2UgR0xfVEVYVFVSRV8yRDoKKyAgICAgICAgLy8gdGhlc2UgbmVlZCB0byBmYWxsIHRocm91Z2ggaW50byB0aGUgcmFzdGVyaXplcgorICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmVuYWJsZURpc2FibGUoYywgY2FwLCBlbmFibGVkKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIGNhc2UgR0xfTVVMVElTQU1QTEU6CisgICAgY2FzZSBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0U6CisgICAgY2FzZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FOgorICAgIGNhc2UgR0xfU0FNUExFX0NPVkVSQUdFOgorICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKyNpZiAwCisjcHJhZ21hIG1hcmsgLQorI2VuZGlmCisKKy8vIFRoZXNlIG9uZXMgYXJlIHN1cGVyLWVhc3ksIHdlJ3JlIG5vdCBzdXBwb3J0aW5nIHRob3NlIGZlYXR1cmVzIQordm9pZCBnbFNhbXBsZUNvdmVyYWdlKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7Cit9Cit2b2lkIGdsU2FtcGxlQ292ZXJhZ2V4KEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7Cit9Cit2b2lkIGdsU3RlbmNpbEZ1bmMoR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmIChmdW5jIDwgR0xfTkVWRVIgfHwgZnVuYyA+IEdMX0FMV0FZUykgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIGZyb20gT3BlbkdMfEVTIDEuMCBzZXBjaWZpY2F0aW9uOgorICAgIC8vIElmIHRoZXJlIGlzIG5vIHN0ZW5jaWwgYnVmZmVyLCBubyBzdGVuY2lsIG1vZGlmaWNhdGlvbiBjYW4gb2NjdXIKKyAgICAvLyBhbmQgaXQgaXMgYXMgaWYgdGhlIHN0ZW5jaWwgdGVzdCBhbHdheXMgcGFzc2VzLgorfQorCit2b2lkIGdsU3RlbmNpbE9wKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcykgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKChzdGVuY2lsb3BfdmFsaWQoZmFpbCkgJgorICAgICAgICAgc3RlbmNpbG9wX3ZhbGlkKHpmYWlsKSAmCisgICAgICAgICBzdGVuY2lsb3BfdmFsaWQoenBhc3MpKSA9PSAwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBnbEFscGhhRnVuYyhHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKQoreworICAgIGdsQWxwaGFGdW5jeChmdW5jLCBnZ2xGbG9hdFRvRml4ZWQocmVmKSk7Cit9CisKK3ZvaWQgZ2xDdWxsRmFjZShHTGVudW0gbW9kZSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgR0xfRlJPTlQ6CisgICAgY2FzZSBHTF9CQUNLOgorICAgIGNhc2UgR0xfRlJPTlRfQU5EX0JBQ0s6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgfQorICAgIGMtPmN1bGwuY3VsbEZhY2UgPSBtb2RlOworfQorCit2b2lkIGdsRnJvbnRGYWNlKEdMZW51bSBtb2RlKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBHTF9DVzoKKyAgICBjYXNlIEdMX0NDVzoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjLT5jdWxsLmZyb250RmFjZSA9IG1vZGU7Cit9CisKK3ZvaWQgZ2xIaW50KEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgc3dpdGNoICh0YXJnZXQpIHsKKyAgICBjYXNlIEdMX0ZPR19ISU5UOgorICAgIGNhc2UgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQ6CisgICAgY2FzZSBHTF9MSU5FX1NNT09USF9ISU5UOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1BPSU5UX1NNT09USF9ISU5UOgorICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmVuYWJsZURpc2FibGUoYywgCisgICAgICAgICAgICAgICAgR0dMX1BPSU5UX1NNT09USF9OSUNFLCBtb2RlPT1HTF9OSUNFU1QpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVDoKKyAgICAgICAgYy0+cGVyc3BlY3RpdmUgPSAobW9kZSA9PSBHTF9OSUNFU1QpID8gMSA6IDA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgfQorfQorCit2b2lkIGdsRW5hYmxlKEdMZW51bSBjYXApIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGVuYWJsZV9kaXNhYmxlKGMsIGNhcCwgMSk7Cit9Cit2b2lkIGdsRGlzYWJsZShHTGVudW0gY2FwKSB7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBlbmFibGVfZGlzYWJsZShjLCBjYXAsIDApOworfQorCit2b2lkIGdsRmluaXNoKCkKK3sgLy8gbm90aGluZyB0byBkbyBmb3Igb3VyIHNvZnR3YXJlIGltcGxlbWVudGF0aW9uCit9CisKK3ZvaWQgZ2xGbHVzaCgpCit7IC8vIG5vdGhpbmcgdG8gZG8gZm9yIG91ciBzb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbgorfQorCitHTGVudW0gZ2xHZXRFcnJvcigpCit7CisgICAgLy8gRnJvbSBPcGVuR0x8RVMgMS4wIHNwZWNpZmljYXRpb246CisgICAgLy8gSWYgbW9yZSB0aGFuIG9uZSBmbGFnIGhhcyByZWNvcmRlZCBhbiBlcnJvciwgZ2xHZXRFcnJvciByZXR1cm5zCisgICAgLy8gYW5kIGNsZWFycyBhbiBhcmJpdHJhcnkgZXJyb3IgZmxhZyB2YWx1ZS4gVGh1cywgZ2xHZXRFcnJvciBzaG91bGQKKyAgICAvLyBhbHdheXMgYmUgY2FsbGVkIGluIGEgbG9vcCwgdW50aWwgaXQgcmV0dXJucyBHTF9OT19FUlJPUiwKKyAgICAvLyBpZiBhbGwgZXJyb3IgZmxhZ3MgYXJlIHRvIGJlIHJlc2V0LgorCisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAoYy0+ZXJyb3IpIHsKKyAgICAgICAgY29uc3QgR0xlbnVtIHJldChjLT5lcnJvcik7CisgICAgICAgIGMtPmVycm9yID0gMDsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgCisgICAgaWYgKGMtPnJhc3Rlcml6ZXIuZXJyb3IpIHsKKyAgICAgICAgY29uc3QgR0xlbnVtIHJldChjLT5yYXN0ZXJpemVyLmVycm9yKTsKKyAgICAgICAgYy0+cmFzdGVyaXplci5lcnJvciA9IDA7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIEdMX05PX0VSUk9SOworfQorCitjb25zdCBHTHVieXRlKiBnbEdldFN0cmluZyhHTGVudW0gc3RyaW5nKQoreworICAgIHN3aXRjaCAoc3RyaW5nKSB7CisgICAgY2FzZSBHTF9WRU5ET1I6ICAgICByZXR1cm4gKGNvbnN0IEdMdWJ5dGUqKWdWZW5kb3JTdHJpbmc7CisgICAgY2FzZSBHTF9SRU5ERVJFUjogICByZXR1cm4gKGNvbnN0IEdMdWJ5dGUqKWdSZW5kZXJlclN0cmluZzsKKyAgICBjYXNlIEdMX1ZFUlNJT046ICAgIHJldHVybiAoY29uc3QgR0x1Ynl0ZSopZ1ZlcnNpb25TdHJpbmc7CisgICAgY2FzZSBHTF9FWFRFTlNJT05TOiByZXR1cm4gKGNvbnN0IEdMdWJ5dGUqKWdFeHRlbnNpb25zU3RyaW5nOworICAgIH0KKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZ2xHZXRJbnRlZ2VydihHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgY2FzZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0U6CisgICAgICAgIHBhcmFtc1swXSA9IDA7CisgICAgICAgIHBhcmFtc1sxXSA9IEdHTF9NQVhfQUxJQVNFRF9QT0lOVF9TSVpFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRToKKyAgICAgICAgcGFyYW1zWzBdID0gMDsKKyAgICAgICAgcGFyYW1zWzFdID0gR0dMX01BWF9BTElBU0VEX1BPSU5UX1NJWkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfQUxQSEFfQklUUzogeworICAgICAgICBpbnQgaW5kZXggPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuY29sb3IuZm9ybWF0OworICAgICAgICBHR0xGb3JtYXQgY29uc3QgKiBmb3JtYXRzID0gZ2dsR2V0UGl4ZWxGb3JtYXRUYWJsZSgpOworICAgICAgICBwYXJhbXNbMF0gPSBmb3JtYXRzW2luZGV4XS5haCAtIGZvcm1hdHNbaW5kZXhdLmFsOworICAgICAgICBicmVhazsgCisgICAgICAgIH0KKyAgICBjYXNlIEdMX1JFRF9CSVRTOiB7CisgICAgICAgIGludCBpbmRleCA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5jb2xvci5mb3JtYXQ7CisgICAgICAgIEdHTEZvcm1hdCBjb25zdCAqIGZvcm1hdHMgPSBnZ2xHZXRQaXhlbEZvcm1hdFRhYmxlKCk7CisgICAgICAgIHBhcmFtc1swXSA9IGZvcm1hdHNbaW5kZXhdLnJoIC0gZm9ybWF0c1tpbmRleF0ucmw7CisgICAgICAgIGJyZWFrOyAKKyAgICAgICAgfQorICAgIGNhc2UgR0xfR1JFRU5fQklUUzogeworICAgICAgICBpbnQgaW5kZXggPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuY29sb3IuZm9ybWF0OworICAgICAgICBHR0xGb3JtYXQgY29uc3QgKiBmb3JtYXRzID0gZ2dsR2V0UGl4ZWxGb3JtYXRUYWJsZSgpOworICAgICAgICBwYXJhbXNbMF0gPSBmb3JtYXRzW2luZGV4XS5naCAtIGZvcm1hdHNbaW5kZXhdLmdsOworICAgICAgICBicmVhazsgCisgICAgICAgIH0KKyAgICBjYXNlIEdMX0JMVUVfQklUUzogeworICAgICAgICBpbnQgaW5kZXggPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuY29sb3IuZm9ybWF0OworICAgICAgICBHR0xGb3JtYXQgY29uc3QgKiBmb3JtYXRzID0gZ2dsR2V0UGl4ZWxGb3JtYXRUYWJsZSgpOworICAgICAgICBwYXJhbXNbMF0gPSBmb3JtYXRzW2luZGV4XS5iaCAtIGZvcm1hdHNbaW5kZXhdLmJsOworICAgICAgICBicmVhazsgCisgICAgICAgIH0KKyAgICBjYXNlIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTOgorICAgICAgICBwYXJhbXNbIDBdID0gR0xfUEFMRVRURTRfUkdCOF9PRVM7CisgICAgICAgIHBhcmFtc1sgMV0gPSBHTF9QQUxFVFRFNF9SR0JBOF9PRVM7CisgICAgICAgIHBhcmFtc1sgMl0gPSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVM7CisgICAgICAgIHBhcmFtc1sgM10gPSBHTF9QQUxFVFRFNF9SR0JBNF9PRVM7CisgICAgICAgIHBhcmFtc1sgNF0gPSBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUzsKKyAgICAgICAgcGFyYW1zWyA1XSA9IEdMX1BBTEVUVEU4X1JHQjhfT0VTOworICAgICAgICBwYXJhbXNbIDZdID0gR0xfUEFMRVRURThfUkdCQThfT0VTOworICAgICAgICBwYXJhbXNbIDddID0gR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTOworICAgICAgICBwYXJhbXNbIDhdID0gR0xfUEFMRVRURThfUkdCQTRfT0VTOworICAgICAgICBwYXJhbXNbIDldID0gR0xfUEFMRVRURThfUkdCNV9BMV9PRVM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfREVQVEhfQklUUzoKKyAgICAgICAgcGFyYW1zWzBdID0gYy0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLmRlcHRoLmZvcm1hdCA/IDAgOiAxNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVM6CisgICAgICAgIHBhcmFtc1swXSA9IEdMX1JHQjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTOgorICAgICAgICBwYXJhbXNbMF0gPSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfTElHSFRTOgorICAgICAgICBwYXJhbXNbMF0gPSBPR0xFU19NQVhfTElHSFRTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX01BWF9DTElQX1BMQU5FUzoKKyAgICAgICAgcGFyYW1zWzBdID0gT0dMRVNfTUFYX0NMSVBfUExBTkVTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEg6CisgICAgICAgIHBhcmFtc1swXSA9IE9HTEVTX01PREVMVklFV19TVEFDS19ERVBUSDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSDoKKyAgICAgICAgcGFyYW1zWzBdID0gT0dMRVNfUFJPSkVDVElPTl9TVEFDS19ERVBUSDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSDoKKyAgICAgICAgcGFyYW1zWzBdID0gT0dMRVNfVEVYVFVSRV9TVEFDS19ERVBUSDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9TSVpFOgorICAgICAgICBwYXJhbXNbMF0gPSBHR0xfTUFYX1RFWFRVUkVfU0laRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9VTklUUzoKKyAgICAgICAgcGFyYW1zWzBdID0gR0dMX1RFWFRVUkVfVU5JVF9DT1VOVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfVklFV1BPUlRfRElNUzoKKyAgICAgICAgcGFyYW1zWzBdID0gR0dMX01BWF9WSUVXUE9SVF9ESU1TOworICAgICAgICBwYXJhbXNbMV0gPSBHR0xfTUFYX1ZJRVdQT1JUX0RJTVM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTOgorICAgICAgICBwYXJhbXNbMF0gPSBPR0xFU19OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0U6CisgICAgICAgIHBhcmFtc1swXSA9IDA7CisgICAgICAgIHBhcmFtc1sxXSA9IEdHTF9NQVhfU01PT1RIX0xJTkVfV0lEVEg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0U6CisgICAgICAgIHBhcmFtc1swXSA9IDA7CisgICAgICAgIHBhcmFtc1sxXSA9IEdHTF9NQVhfU01PT1RIX1BPSU5UX1NJWkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfU1RFTkNJTF9CSVRTOgorICAgICAgICBwYXJhbXNbMF0gPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NVQlBJWEVMX0JJVFM6CisgICAgICAgIHBhcmFtc1swXSA9IEdHTF9TVUJQSVhFTF9CSVRTOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVM6CisgICAgICAgIG1lbWNweSggcGFyYW1zLAorICAgICAgICAgICAgICAgIGMtPnRyYW5zZm9ybXMubW9kZWx2aWV3LnRvcCgpLmVsZW1lbnRzKCksCisgICAgICAgICAgICAgICAgMTYqc2l6ZW9mKEdMaW50KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfUFJPSkVDVElPTl9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTOgorICAgICAgICBtZW1jcHkoIHBhcmFtcywKKyAgICAgICAgICAgICAgICBjLT50cmFuc2Zvcm1zLnByb2plY3Rpb24udG9wKCkuZWxlbWVudHMoKSwKKyAgICAgICAgICAgICAgICAxNipzaXplb2YoR0xpbnQpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9URVhUVVJFX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVM6CisgICAgICAgIG1lbWNweSggcGFyYW1zLAorICAgICAgICAgICAgICAgIGMtPnRyYW5zZm9ybXMudGV4dHVyZVtjLT50ZXh0dXJlcy5hY3RpdmVdLnRvcCgpLmVsZW1lbnRzKCksCisgICAgICAgICAgICAgICAgMTYqc2l6ZW9mKEdMaW50KSk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgZ2xQb2ludFNpemUoR0xmbG9hdCBzaXplKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKHNpemUgPD0gMCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPnBvaW50LnNpemUgPSBUUklfRlJPTV9GSVhFRChnZ2xGbG9hdFRvRml4ZWQoc2l6ZSkpOworfQorCit2b2lkIGdsUG9pbnRTaXpleChHTGZpeGVkIHNpemUpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAoc2l6ZSA8PSAwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+cG9pbnQuc2l6ZSA9IFRSSV9GUk9NX0ZJWEVEKHNpemUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgZ2xMaW5lV2lkdGgoR0xmbG9hdCB3aWR0aCkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmICh3aWR0aCA8PSAwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+bGluZS53aWR0aCA9IFRSSV9GUk9NX0ZJWEVEKGdnbEZsb2F0VG9GaXhlZCh3aWR0aCkpOworfQorCit2b2lkIGdsTGluZVdpZHRoeChHTGZpeGVkIHdpZHRoKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKHdpZHRoIDw9IDApIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjLT5saW5lLndpZHRoID0gVFJJX0ZST01fRklYRUQod2lkdGgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgZ2xDb2xvck1hc2soR0xib29sZWFuIHIsIEdMYm9vbGVhbiBnLCBHTGJvb2xlYW4gYiwgR0xib29sZWFuIGEpIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3JNYXNrKGMsIHIsIGcsIGIsIGEpOworfQorCit2b2lkIGdsRGVwdGhNYXNrKEdMYm9vbGVhbiBmbGFnKSB7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmRlcHRoTWFzayhjLCBmbGFnKTsKK30KKwordm9pZCBnbFN0ZW5jaWxNYXNrKEdMdWludCBtYXNrKSB7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnN0ZW5jaWxNYXNrKGMsIG1hc2spOworfQorCit2b2lkIGdsRGVwdGhGdW5jKEdMZW51bSBmdW5jKSB7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmRlcHRoRnVuYyhjLCBmdW5jKTsKK30KKwordm9pZCBnbExvZ2ljT3AoR0xlbnVtIG9wY29kZSkgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5sb2dpY09wKGMsIG9wY29kZSk7Cit9CisKK3ZvaWQgZ2xBbHBoYUZ1bmN4KEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWxwaGFGdW5jeChjLCBmdW5jLCByZWYpOworfQorCit2b2lkIGdsQmxlbmRGdW5jKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvcikgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5ibGVuZEZ1bmMoYywgc2ZhY3RvciwgZGZhY3Rvcik7Cit9CisKK3ZvaWQgZ2xDbGVhcihHTGJpdGZpZWxkIG1hc2spIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY2xlYXIoYywgbWFzayk7Cit9CisKK3ZvaWQgZ2xDbGVhckNvbG9yeChHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSkgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5jbGVhckNvbG9yeChjLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9CisKK3ZvaWQgZ2xDbGVhckNvbG9yKEdMY2xhbXBmIHIsIEdMY2xhbXBmIGcsIEdMY2xhbXBmIGIsIEdMY2xhbXBmIGEpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNsZWFyQ29sb3J4KGMsCisgICAgICAgICAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChyKSwKKyAgICAgICAgICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGcpLAorICAgICAgICAgICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoYiksCisgICAgICAgICAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChhKSk7Cit9CisKK3ZvaWQgZ2xDbGVhckRlcHRoeChHTGNsYW1weCBkZXB0aCkgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5jbGVhckRlcHRoeChjLCBkZXB0aCk7Cit9CisKK3ZvaWQgZ2xDbGVhckRlcHRoZihHTGNsYW1wZiBkZXB0aCkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY2xlYXJEZXB0aHgoYywgZ2dsRmxvYXRUb0ZpeGVkKGRlcHRoKSk7Cit9CisKK3ZvaWQgZ2xDbGVhclN0ZW5jaWwoR0xpbnQgcykgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5jbGVhclN0ZW5jaWwoYywgcyk7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL3N0YXRlLmggYi9vcGVuZ2wvbGliYWdsL3N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhNWNjYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJhZ2wvc3RhdGUuaApAQCAtMCwwICsxLDU0IEBACisvKiBsaWJzL29wZW5nbGVzL3N0YXRlLmgKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfU1RBVEVfSAorI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX1NUQVRFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8cHJpdmF0ZS9waXhlbGZsaW5nZXIvZ2dsX2NvbnRleHQuaD4KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworb2dsZXNfY29udGV4dF90ICpvZ2xlc19pbml0KHNpemVfdCBleHRyYSk7Cit2b2lkIG9nbGVzX3VuaW5pdChvZ2xlc19jb250ZXh0X3QqIGMpOwordm9pZCBfb2dsZXNfZXJyb3Iob2dsZXNfY29udGV4dF90KiBjLCBHTGVudW0gZXJyb3IpOworCisjaWZuZGVmIFRSQUNFX0dMX0VSUk9SUworI2RlZmluZSBUUkFDRV9HTF9FUlJPUlMgMAorI2VuZGlmCisKKyNpZiBUUkFDRV9HTF9FUlJPUlMKKyNkZWZpbmUgb2dsZXNfZXJyb3IoYywgZXJyb3IpIFwKK2RvIHsgXAorICBwcmludGYoIm9nbGVzX2Vycm9yIGF0IGZpbGUgJXMgbGluZSAlZFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsgXAorICBfb2dsZXNfZXJyb3IoYywgZXJyb3IpOyBcCit9IHdoaWxlICgwKQorI2Vsc2UgLyogIVRSQUNFX0dMX0VSUk9SUyAqLworI2RlZmluZSBvZ2xlc19lcnJvcihjLCBlcnJvcikgX29nbGVzX2Vycm9yKChjKSwgKGVycm9yKSkKKyNlbmRpZgorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9PUEVOR0xFU19TVEFURV9ICisKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvdGV4dHVyZS5jcHAgYi9vcGVuZ2wvbGliYWdsL3RleHR1cmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZjUzNGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL3RleHR1cmUuY3BwCkBAIC0wLDAgKzEsMTQyMSBAQAorLyogbGlicy9vcGVuZ2xlcy90ZXh0dXJlLmNwcAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImNvbnRleHQuaCIKKyNpbmNsdWRlICJmcC5oIgorI2luY2x1ZGUgInN0YXRlLmgiCisjaW5jbHVkZSAidGV4dHVyZS5oIgorI2luY2x1ZGUgIlRleHR1cmVPYmplY3RNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBiaW5kVGV4dHVyZVRtdSgKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMsIGludCB0bXUsIEdMdWludCB0ZXh0dXJlLCBjb25zdCBzcDxFR0xUZXh0dXJlT2JqZWN0PiYgdGV4KTsKKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK3ZvaWQgZ2VuZXJhdGVNaXBtYXAob2dsZXNfY29udGV4dF90KiBjLCBHTGludCBsZXZlbCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgSW5pdAorI2VuZGlmCisKK3ZvaWQgb2dsZXNfaW5pdF90ZXh0dXJlKG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBjLT50ZXh0dXJlcy5wYWNrQWxpZ25tZW50ICAgPSA0OworICAgIGMtPnRleHR1cmVzLnVucGFja0FsaWdubWVudCA9IDQ7CisKKyAgICAvLyBlYWNoIGNvbnRleHQgaGFzIGEgZGVmYXVsdCBuYW1lZCAoMCkgdGV4dHVyZSAobm90IHNoYXJlZCkKKyAgICBjLT50ZXh0dXJlcy5kZWZhdWx0VGV4dHVyZSA9IG5ldyBFR0xUZXh0dXJlT2JqZWN0KCk7CisgICAgYy0+dGV4dHVyZXMuZGVmYXVsdFRleHR1cmUtPmluY1N0cm9uZyhjKTsKKyAgICAKKyAgICAvLyBiaW5kIHRoZSBkZWZhdWx0IHRleHR1cmUgdG8gZWFjaCB0ZXh0dXJlIHVuaXQKKyAgICBmb3IgKGludCBpPTA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgeworICAgICAgICBiaW5kVGV4dHVyZVRtdShjLCBpLCAwLCBjLT50ZXh0dXJlcy5kZWZhdWx0VGV4dHVyZSk7CisgICAgICAgIG1lbXNldChjLT5jdXJyZW50LnRleHR1cmVbaV0udiwgMCwgc2l6ZW9mKHZlYzRfdCkpOworICAgICAgICBjLT5jdXJyZW50LnRleHR1cmVbaV0uUSA9IDB4MTAwMDA7CisgICAgfQorfQorCit2b2lkIG9nbGVzX3VuaW5pdF90ZXh0dXJlKG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBpZiAoYy0+dGV4dHVyZXMuZ2dsKQorICAgICAgICBnZ2xVbmluaXQoYy0+dGV4dHVyZXMuZ2dsKTsKKyAgICBjLT50ZXh0dXJlcy5kZWZhdWx0VGV4dHVyZS0+ZGVjU3Ryb25nKGMpOworICAgIGZvciAoaW50IGk9MDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKSB7CisgICAgICAgIGlmIChjLT50ZXh0dXJlcy50bXVbaV0udGV4dHVyZSkKKyAgICAgICAgICAgIGMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlLT5kZWNTdHJvbmcoYyk7CisgICAgfQorfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQordm9pZCB2YWxpZGF0ZV90bXUob2dsZXNfY29udGV4dF90KiBjLCBpbnQgaSkKK3sKKyAgICB0ZXh0dXJlX3VuaXRfdCYgdShjLT50ZXh0dXJlcy50bXVbaV0pOworICAgIGlmICh1LmRpcnR5KSB7CisgICAgICAgIHUuZGlydHkgPSAwOworICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmFjdGl2ZVRleHR1cmUoYywgaSk7CisgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYmluZFRleHR1cmUoYywgJih1LnRleHR1cmUtPnN1cmZhY2UpKTsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhHZW5pKGMsIEdHTF9TLAorICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX0dFTl9NT0RFLCBHR0xfQVVUT01BVElDKTsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhHZW5pKGMsIEdHTF9ULAorICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX0dFTl9NT0RFLCBHR0xfQVVUT01BVElDKTsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhQYXJhbWV0ZXJpKGMsIEdHTF9URVhUVVJFXzJELAorICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX1dSQVBfUywgdS50ZXh0dXJlLT53cmFwcyk7CisgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4UGFyYW1ldGVyaShjLCBHR0xfVEVYVFVSRV8yRCwKKyAgICAgICAgICAgICAgICBHR0xfVEVYVFVSRV9XUkFQX1QsIHUudGV4dHVyZS0+d3JhcHQpOworICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleFBhcmFtZXRlcmkoYywgR0dMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICAgICAgR0dMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgdS50ZXh0dXJlLT5taW5fZmlsdGVyKTsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhQYXJhbWV0ZXJpKGMsIEdHTF9URVhUVVJFXzJELAorICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX01BR19GSUxURVIsIHUudGV4dHVyZS0+bWFnX2ZpbHRlcik7CisKKyAgICAgICAgLy8gZGlzYWJsZSB0aGlzIHRleHR1cmUgdW5pdCBpZiBpdCdzIG5vdCBjb21wbGV0ZQorICAgICAgICBpZiAoIXUudGV4dHVyZS0+aXNDb21wbGV0ZSgpKSB7CisgICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmRpc2FibGUoYywgR0dMX1RFWFRVUkVfMkQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIG9nbGVzX3ZhbGlkYXRlX3RleHR1cmVfaW1wbChvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgZm9yIChpbnQgaT0wIDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKSB7CisgICAgICAgIGlmIChjLT5yYXN0ZXJpemVyLnN0YXRlLnRleHR1cmVbaV0uZW5hYmxlKQorICAgICAgICAgICAgdmFsaWRhdGVfdG11KGMsIGkpOworICAgIH0KKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmFjdGl2ZVRleHR1cmUoYywgYy0+dGV4dHVyZXMuYWN0aXZlKTsKK30KKworc3RhdGljCit2b2lkIGludmFsaWRhdGVfdGV4dHVyZShvZ2xlc19jb250ZXh0X3QqIGMsIGludCB0bXUsIHVpbnQ4X3QgZmxhZ3MgPSAweEZGKSB7CisgICAgYy0+dGV4dHVyZXMudG11W3RtdV0uZGlydHkgPSBmbGFnczsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgRm9ybWF0IGNvbnZlcnNpb24KKyNlbmRpZgorCitzdGF0aWMgdWludDMyX3QgZ2wyZm9ybWF0X3RhYmxlWzZdWzRdID0geworICAgIC8vIEJZVEUsIDU2NSwgNDQ0NCwgNTU1MQorICAgIHsgR0dMX1BJWEVMX0ZPUk1BVF9BXzgsCisgICAgICAwLCAwLCAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0xfQUxQSEEKKyAgICB7IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzg4OCwKKyAgICAgIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSwKKyAgICAgIDAsIDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHTF9SR0IKKyAgICB7IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4LAorICAgICAgMCwKKyAgICAgIEdHTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0LAorICAgICAgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzU1NTEgfSwgICAgIC8vIEdMX1JHQkEKKyAgICB7IEdHTF9QSVhFTF9GT1JNQVRfTF84LAorICAgICAgMCwgMCwgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdMX0xVTUlOQU5DRQorICAgIHsgR0dMX1BJWEVMX0ZPUk1BVF9MQV84OCwKKyAgICAgIDAsIDAsIDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBHTF9MVU1JTkFOQ0VfQUxQSEEKK307CisKK3N0YXRpYyBpbnQzMl90IGNvbnZlcnRHTFBpeGVsRm9ybWF0KEdMaW50IGZvcm1hdCwgR0xlbnVtIHR5cGUpCit7CisgICAgaW50MzJfdCBmaSA9IC0xOworICAgIGludDMyX3QgdGkgPSAtMTsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR0xfQUxQSEE6ICAgICAgICAgICAgICBmaSA9IDA7ICAgICBicmVhazsKKyAgICBjYXNlIEdMX1JHQjogICAgICAgICAgICAgICAgZmkgPSAxOyAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9SR0JBOiAgICAgICAgICAgICAgIGZpID0gMjsgICAgIGJyZWFrOworICAgIGNhc2UgR0xfTFVNSU5BTkNFOiAgICAgICAgICBmaSA9IDM7ICAgICBicmVhazsKKyAgICBjYXNlIEdMX0xVTUlOQU5DRV9BTFBIQTogICAgZmkgPSA0OyAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgR0xfVU5TSUdORURfQllURTogICAgICAgICAgdGkgPSAwOyBicmVhazsKKyAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81OiAgIHRpID0gMTsgYnJlYWs7CisgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80OiB0aSA9IDI7IGJyZWFrOworICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMTogdGkgPSAzOyBicmVhazsKKyAgICB9CisgICAgaWYgKGZpPT0tMSB8fCB0aT09LTEpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBnbDJmb3JtYXRfdGFibGVbZmldW3RpXTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgR0xlbnVtIHZhbGlkRm9ybWF0VHlwZShvZ2xlc19jb250ZXh0X3QqIGMsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlKQoreworICAgIEdMZW51bSBlcnJvciA9IDA7CisgICAgaWYgKGZvcm1hdDxHTF9BTFBIQSB8fCBmb3JtYXQ+R0xfTFVNSU5BTkNFX0FMUEhBKSB7CisgICAgICAgIGVycm9yID0gR0xfSU5WQUxJRF9FTlVNOworICAgIH0KKyAgICBpZiAodHlwZSAhPSBHTF9VTlNJR05FRF9CWVRFICYmIHR5cGUgIT0gR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAmJgorICAgICAgICB0eXBlICE9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgJiYgdHlwZSAhPSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSkgeworICAgICAgICBlcnJvciA9IEdMX0lOVkFMSURfRU5VTTsKKyAgICB9CisgICAgaWYgKHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUgJiYgZm9ybWF0ICE9IEdMX1JHQikgeworICAgICAgICBlcnJvciA9IEdMX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpZiAoKHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCB8fAorICAgICAgICAgdHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xKSAgJiYgZm9ybWF0ICE9IEdMX1JHQkEpIHsKKyAgICAgICAgZXJyb3IgPSBHTF9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKGVycm9yKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIGVycm9yKTsKKyAgICB9CisgICAgcmV0dXJuIGVycm9yOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0dHTENvbnRleHQqIGdldFJhc3Rlcml6ZXIob2dsZXNfY29udGV4dF90KiBjKQoreworICAgIEdHTENvbnRleHQqIGdnbCA9IGMtPnRleHR1cmVzLmdnbDsKKyAgICBpZiAoZ2dsX3VubGlrZWx5KCFnZ2wpKSB7CisgICAgICAgIC8vIHRoaXMgaXMgcXVpdGUgaGVhdnkgdGhlIGZpcnN0IHRpbWUuLi4KKyAgICAgICAgZ2dsSW5pdCgmZ2dsKTsKKyAgICAgICAgaWYgKCFnZ2wpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIEdHTGZpeGVkIGNvbG9yc1s0XSA9IHsgMCwgMCwgMCwgMHgxMDAwMCB9OworICAgICAgICBjLT50ZXh0dXJlcy5nZ2wgPSBnZ2w7CisgICAgICAgIGdnbC0+YWN0aXZlVGV4dHVyZShnZ2wsIDApOworICAgICAgICBnZ2wtPmVuYWJsZShnZ2wsIEdHTF9URVhUVVJFXzJEKTsKKyAgICAgICAgZ2dsLT50ZXhFbnZpKGdnbCwgR0dMX1RFWFRVUkVfRU5WLCBHR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0dMX1JFUExBQ0UpOworICAgICAgICBnZ2wtPmRpc2FibGUoZ2dsLCBHR0xfRElUSEVSKTsKKyAgICAgICAgZ2dsLT5zaGFkZU1vZGVsKGdnbCwgR0dMX0ZMQVQpOworICAgICAgICBnZ2wtPmNvbG9yNHh2KGdnbCwgY29sb3JzKTsKKyAgICB9CisgICAgcmV0dXJuIGdnbDsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK2ludCBjb3B5UGl4ZWxzKAorICAgICAgICBvZ2xlc19jb250ZXh0X3QqIGMsCisgICAgICAgIGNvbnN0IEdHTFN1cmZhY2UmIGRzdCwKKyAgICAgICAgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwKKyAgICAgICAgY29uc3QgR0dMU3VyZmFjZSYgc3JjLAorICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHcsIEdMc2l6ZWkgaCkKK3sKKyAgICBpZiAoKGRzdC5mb3JtYXQgPT0gc3JjLmZvcm1hdCkgJiYKKyAgICAgICAgKGRzdC5zdHJpZGUgPT0gc3JjLnN0cmlkZSkgJiYKKyAgICAgICAgKGRzdC53aWR0aCA9PSBzcmMud2lkdGgpICYmCisgICAgICAgIChkc3QuaGVpZ2h0ID09IHNyYy5oZWlnaHQpICYmCisgICAgICAgIChkc3Quc3RyaWRlID4gMCkgJiYKKyAgICAgICAgKCh4fHkpID09IDApICYmCisgICAgICAgICgoeG9mZnNldHx5b2Zmc2V0KSA9PSAwKSkKKyAgICB7CisgICAgICAgIC8vIHRoaXMgaXMgYSBjb21tb24gY2FzZS4uLgorICAgICAgICBjb25zdCBHR0xGb3JtYXQmIHBpeGVsRm9ybWF0KGMtPnJhc3Rlcml6ZXIuZm9ybWF0c1tzcmMuZm9ybWF0XSk7CisgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gc3JjLmhlaWdodCAqIHNyYy5zdHJpZGUgKiBwaXhlbEZvcm1hdC5zaXplOworICAgICAgICBtZW1jcHkoZHN0LmRhdGEsIHNyYy5kYXRhLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gdXNlIHBpeGVsLWZsaW5nZXIgdG8gaGFuZGxlIGFsbCB0aGUgY29udmVyc2lvbnMKKyAgICBHR0xDb250ZXh0KiBnZ2wgPSBnZXRSYXN0ZXJpemVyKGMpOworICAgIGlmICghZ2dsKSB7CisgICAgICAgIC8vIHRoZSBvbmx5IHJlYXNvbiB0aGlzIHdvdWxkIGZhaWwgaXMgYmVjYXVzZSB3ZSByYW4gb3V0IG9mIG1lbW9yeQorICAgICAgICByZXR1cm4gR0xfT1VUX09GX01FTU9SWTsKKyAgICB9CisKKyAgICBnZ2wtPmNvbG9yQnVmZmVyKGdnbCwgJmRzdCk7CisgICAgZ2dsLT5iaW5kVGV4dHVyZShnZ2wsICZzcmMpOworICAgIGdnbC0+dGV4Q29vcmQyaShnZ2wsIHgteG9mZnNldCwgeS15b2Zmc2V0KTsKKyAgICBnZ2wtPnJlY3RpKGdnbCwgeG9mZnNldCwgeW9mZnNldCwgeG9mZnNldCt3LCB5b2Zmc2V0K2gpOworICAgIHJldHVybiAwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCitzcDxFR0xUZXh0dXJlT2JqZWN0PiBnZXRBbmRCaW5kQWN0aXZlVGV4dHVyZU9iamVjdChvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgc3A8RUdMVGV4dHVyZU9iamVjdD4gdGV4OworICAgIGNvbnN0IGludCBhY3RpdmUgPSBjLT50ZXh0dXJlcy5hY3RpdmU7CisgICAgY29uc3QgR0x1aW50IG5hbWUgPSBjLT50ZXh0dXJlcy50bXVbYWN0aXZlXS5uYW1lOworCisgICAgLy8gZnJlZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91c2x5IGJvdW5kIG9iamVjdAorICAgIHRleHR1cmVfdW5pdF90JiB1KGMtPnRleHR1cmVzLnRtdVthY3RpdmVdKTsKKyAgICBpZiAodS50ZXh0dXJlKQorICAgICAgICB1LnRleHR1cmUtPmRlY1N0cm9uZyhjKTsKKworICAgIGlmIChuYW1lID09IDApIHsKKyAgICAgICAgLy8gMCBpcyBvdXIgbG9jYWwgdGV4dHVyZSBvYmplY3QsIG5vdCBzaGFyZWQgd2l0aCBhbnlvbmUuIAorICAgICAgICAvLyBCdXQgaXQgYWZmZWN0cyBhbGwgYm91bmQgVE1VcyBpbW1lZGlhdGVseS4KKyAgICAgICAgLy8gKHdlIG5lZWQgdG8gaW52YWxpZGF0ZSBhbGwgdW5pdHMgYm91bmQgdG8gdGhpcyB0ZXh0dXJlIG9iamVjdCkKKyAgICAgICAgdGV4ID0gYy0+dGV4dHVyZXMuZGVmYXVsdFRleHR1cmU7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgeworICAgICAgICAgICAgaWYgKGMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlID09IHRleC5nZXQoKSkKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlX3RleHR1cmUoYywgaSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBnZXQgYSBuZXcgdGV4dHVyZSBvYmplY3QgZm9yIHRoYXQgbmFtZQorICAgICAgICB0ZXggPSBjLT5zdXJmYWNlTWFuYWdlci0+cmVwbGFjZVRleHR1cmUobmFtZSk7CisgICAgfQorCisgICAgLy8gYmluZCB0aGlzIHRleHR1cmUgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIHRleHR1cmUgdW5pdAorICAgIC8vIGFuZCBhZGQgYSByZWZlcmVuY2UgdG8gdGhpcyB0ZXh0dXJlIG9iamVjdAorICAgIHUudGV4dHVyZSA9IHRleC5nZXQoKTsKKyAgICB1LnRleHR1cmUtPmluY1N0cm9uZyhjKTsKKyAgICB1Lm5hbWUgPSBuYW1lOworICAgIGludmFsaWRhdGVfdGV4dHVyZShjLCBhY3RpdmUpOyAgICAKKyAgICByZXR1cm4gdGV4OworfQorCit2b2lkIGJpbmRUZXh0dXJlVG11KAorICAgIG9nbGVzX2NvbnRleHRfdCogYywgaW50IHRtdSwgR0x1aW50IHRleHR1cmUsIGNvbnN0IHNwPEVHTFRleHR1cmVPYmplY3Q+JiB0ZXgpCit7CisgICAgaWYgKHRleC5nZXQoKSA9PSBjLT50ZXh0dXJlcy50bXVbdG11XS50ZXh0dXJlKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgLy8gZnJlZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91c2x5IGJvdW5kIG9iamVjdAorICAgIHRleHR1cmVfdW5pdF90JiB1KGMtPnRleHR1cmVzLnRtdVt0bXVdKTsKKyAgICBpZiAodS50ZXh0dXJlKQorICAgICAgICB1LnRleHR1cmUtPmRlY1N0cm9uZyhjKTsKKworICAgIC8vIGJpbmQgdGhpcyB0ZXh0dXJlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSB0ZXh0dXJlIHVuaXQKKyAgICAvLyBhbmQgYWRkIGEgcmVmZXJlbmNlIHRvIHRoaXMgdGV4dHVyZSBvYmplY3QKKyAgICB1LnRleHR1cmUgPSB0ZXguZ2V0KCk7CisgICAgdS50ZXh0dXJlLT5pbmNTdHJvbmcoYyk7CisgICAgdS5uYW1lID0gdGV4dHVyZTsKKyAgICBpbnZhbGlkYXRlX3RleHR1cmUoYywgdG11KTsKK30KKworaW50IGNyZWF0ZVRleHR1cmVTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogYywKKyAgICAgICAgR0dMU3VyZmFjZSoqIG91dFN1cmZhY2UsIGludDMyX3QqIG91dFNpemUsIEdMaW50IGxldmVsLAorICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgIEdMZW51bSBjb21wcmVzc2VkRm9ybWF0ID0gMCkKK3sKKyAgICAvLyBmaW5kIG91dCB3aGljaCB0ZXh0dXJlIGlzIGJvdW5kIHRvIHRoZSBjdXJyZW50IHVuaXQKKyAgICBjb25zdCBpbnQgYWN0aXZlID0gYy0+dGV4dHVyZXMuYWN0aXZlOworICAgIGNvbnN0IEdMdWludCBuYW1lID0gYy0+dGV4dHVyZXMudG11W2FjdGl2ZV0ubmFtZTsKKworICAgIC8vIGNvbnZlcnQgdGhlIHBpeGVsZm9ybWF0IHRvIG9uZSB3ZSBjYW4gaGFuZGxlCisgICAgY29uc3QgaW50MzJfdCBmb3JtYXRJZHggPSBjb252ZXJ0R0xQaXhlbEZvcm1hdChmb3JtYXQsIHR5cGUpOworICAgIGlmIChmb3JtYXRJZHggPT0gMCkgeyAvLyB3ZSBkb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCB0aGlzCisgICAgICAgIHJldHVybiBHTF9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgCisgICAgLy8gZmlndXJlIG91dCB0aGUgc2l6ZSB3ZSBuZWVkIGFzIHdlbGwgYXMgdGhlIHN0cmlkZQorICAgIGNvbnN0IEdHTEZvcm1hdCYgcGl4ZWxGb3JtYXQoYy0+cmFzdGVyaXplci5mb3JtYXRzW2Zvcm1hdElkeF0pOworICAgIGNvbnN0IGludDMyX3QgYWxpZ24gPSBjLT50ZXh0dXJlcy51bnBhY2tBbGlnbm1lbnQtMTsKKyAgICBjb25zdCBpbnQzMl90IGJwciA9ICgod2lkdGggKiBwaXhlbEZvcm1hdC5zaXplKSArIGFsaWduKSAmIH5hbGlnbjsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IGJwciAqIGhlaWdodDsKKyAgICBjb25zdCBpbnQzMl90IHN0cmlkZSA9IGJwciAvIHBpeGVsRm9ybWF0LnNpemU7CisKKyAgICBpZiAobGV2ZWwgPiAwKSB7CisgICAgICAgIGNvbnN0IGludCBhY3RpdmUgPSBjLT50ZXh0dXJlcy5hY3RpdmU7CisgICAgICAgIEVHTFRleHR1cmVPYmplY3QqIHRleCA9IGMtPnRleHR1cmVzLnRtdVthY3RpdmVdLnRleHR1cmU7CisgICAgICAgIHN0YXR1c190IGVyciA9IHRleC0+cmVhbGxvY2F0ZShsZXZlbCwKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIGZvcm1hdElkeCwgY29tcHJlc3NlZEZvcm1hdCwgYnByKTsKKyAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikKKyAgICAgICAgICAgIHJldHVybiBHTF9PVVRfT0ZfTUVNT1JZOworICAgICAgICBHR0xTdXJmYWNlJiBzdXJmYWNlID0gdGV4LT5lZGl0TWlwKGxldmVsKTsKKyAgICAgICAgKm91dFN1cmZhY2UgPSAmc3VyZmFjZTsKKyAgICAgICAgKm91dFNpemUgPSBzaXplOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiB0ZXggPSBnZXRBbmRCaW5kQWN0aXZlVGV4dHVyZU9iamVjdChjKTsKKyAgICBzdGF0dXNfdCBlcnIgPSB0ZXgtPnJlYWxsb2NhdGUobGV2ZWwsCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIGZvcm1hdElkeCwgY29tcHJlc3NlZEZvcm1hdCwgYnByKTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKQorICAgICAgICByZXR1cm4gR0xfT1VUX09GX01FTU9SWTsKKworICAgIHRleC0+aW50ZXJuYWxmb3JtYXQgPSBmb3JtYXQ7CisgICAgKm91dFN1cmZhY2UgPSAmdGV4LT5zdXJmYWNlOworICAgICpvdXRTaXplID0gc2l6ZTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlUGFsZXR0ZTQoY29uc3QgR0x2b2lkICpkYXRhLCBpbnQgbGV2ZWwsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnN1cmZhY2UsIGludCBzdHJpZGUsIGludCBmb3JtYXQpCisKK3sKKyAgICBpbnQgaW5kZXhCaXRzID0gODsKKyAgICBpbnQgZW50cnlTaXplID0gMDsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCOF9PRVM6CisgICAgICAgIGluZGV4Qml0cyA9IDQ7CisgICAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSBHTF9QQUxFVFRFOF9SR0I4X09FUzoKKyAgICAgICAgZW50cnlTaXplID0gMzsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE4X09FUzoKKyAgICAgICAgaW5kZXhCaXRzID0gNDsKKyAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQkE4X09FUzoKKyAgICAgICAgZW50cnlTaXplID0gNDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE0X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTOgorICAgICAgICBpbmRleEJpdHMgPSA0OworICAgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgIGNhc2UgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCQTRfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCNV9BMV9PRVM6CisgICAgICAgIGVudHJ5U2l6ZSA9IDI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNvbnN0IGludCBwYWxldHRlU2l6ZSA9ICgxIDw8IGluZGV4Qml0cykgKiBlbnRyeVNpemU7CisgICAgdWludDhfdCBjb25zdCogcGl4ZWxzID0gKHVpbnQ4X3QgKilkYXRhICsgcGFsZXR0ZVNpemU7CisgICAgZm9yIChpbnQgaT0wIDsgaTxsZXZlbCA7IGkrKykgeworICAgICAgICBpbnQgdyA9ICh3aWR0aCAgPj4gaSkgPyA6IDE7CisgICAgICAgIGludCBoID0gKGhlaWdodCA+PiBpKSA/IDogMTsKKyAgICAgICAgcGl4ZWxzICs9IGggKiAoKHcgKiBpbmRleEJpdHMpIC8gOCk7CisgICAgfQorICAgIHdpZHRoICA9ICh3aWR0aCAgPj4gbGV2ZWwpID8gOiAxOworICAgIGhlaWdodCA9IChoZWlnaHQgPj4gbGV2ZWwpID8gOiAxOworCisgICAgaWYgKGVudHJ5U2l6ZSA9PSAyKSB7CisgICAgICAgIHVpbnQ4X3QgY29uc3QqIGNvbnN0IHBhbGV0dGUgPSAodWludDhfdCopZGF0YTsKKyAgICAgICAgZm9yIChpbnQgeT0wIDsgeTxoZWlnaHQgOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QqIHAgPSAodWludDhfdCopc3VyZmFjZSArIHkqc3RyaWRlKjI7CisgICAgICAgICAgICBpZiAoaW5kZXhCaXRzID09IDgpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCB4PTAgOyB4PHdpZHRoIDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IDIgKiAoKnBpeGVscysrKTsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAwXTsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8d2lkdGggOyB4Kz0yKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2ID0gKnBpeGVscysrOworICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAyICogKHYgPj4gNCk7CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMF07CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07CisgICAgICAgICAgICAgICAgICAgIGlmICh4KzEgPCB3aWR0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAyICogKHYgJiAweEYpOworICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGVudHJ5U2l6ZSA9PSAzKSB7CisgICAgICAgIHVpbnQ4X3QgY29uc3QqIGNvbnN0IHBhbGV0dGUgPSAodWludDhfdCopZGF0YTsKKyAgICAgICAgZm9yIChpbnQgeT0wIDsgeTxoZWlnaHQgOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QqIHAgPSAodWludDhfdCopc3VyZmFjZSArIHkqc3RyaWRlKjM7CisgICAgICAgICAgICBpZiAoaW5kZXhCaXRzID09IDgpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCB4PTAgOyB4PHdpZHRoIDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IDMgKiAoKnBpeGVscysrKTsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAwXTsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8d2lkdGggOyB4Kz0yKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2ID0gKnBpeGVscysrOworICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAzICogKHYgPj4gNCk7CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMF07CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMl07CisgICAgICAgICAgICAgICAgICAgIGlmICh4KzEgPCB3aWR0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAzICogKHYgJiAweEYpOworICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChlbnRyeVNpemUgPT0gNCkgeworICAgICAgICB1aW50OF90IGNvbnN0KiBjb25zdCBwYWxldHRlID0gKHVpbnQ4X3QqKWRhdGE7CisgICAgICAgIGZvciAoaW50IHk9MCA7IHk8aGVpZ2h0IDsgeSsrKSB7CisgICAgICAgICAgICB1aW50OF90KiBwID0gKHVpbnQ4X3QqKXN1cmZhY2UgKyB5KnN0cmlkZSo0OworICAgICAgICAgICAgaWYgKGluZGV4Qml0cyA9PSA4KSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgeD0wIDsgeDx3aWR0aCA7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSA0ICogKCpwaXhlbHMrKyk7CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMF07CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMl07CisgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgM107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCB4PTAgOyB4PHdpZHRoIDsgeCs9MikgeworICAgICAgICAgICAgICAgICAgICBpbnQgdiA9ICpwaXhlbHMrKzsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gNCAqICh2ID4+IDQpOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDBdOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDFdOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDJdOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDNdOworICAgICAgICAgICAgICAgICAgICBpZiAoeCsxIDwgd2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gNCAqICh2ICYgMHhGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMF07CisgICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgM107CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworCitzdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQordm9pZCBzZXRfZGVwdGhfYW5kX2ZvZyhvZ2xlc19jb250ZXh0X3QqIGMsIEdMaW50IHopCit7CisgICAgY29uc3QgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKKyAgICAvLyB3ZSBuZWVkIHRvIGNvbXB1dGUgWncKKyAgICBpbnQzMl90IGl0ZXJhdG9yc1szXTsKKyAgICBpdGVyYXRvcnNbMV0gPSBpdGVyYXRvcnNbMl0gPSAwOworICAgIEdHTGZpeGVkIFp3OworICAgIEdHTGZpeGVkIG4gPSBnZ2xGbG9hdFRvRml4ZWQoYy0+dHJhbnNmb3Jtcy52cHQuek5lYXIpOworICAgIEdHTGZpeGVkIGYgPSBnZ2xGbG9hdFRvRml4ZWQoYy0+dHJhbnNmb3Jtcy52cHQuekZhcik7CisgICAgaWYgKHo8PTApICAgICAgIFp3ID0gbjsKKyAgICBlbHNlIGlmICh6Pj0xKSAgWncgPSBmOworICAgIGVsc2UgICAgICAgICAgICBadyA9IGdnbE11bEFkZHgoeiwgKGYtbiksIG4pOworICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9GT0cpIHsKKyAgICAgICAgLy8gc2V0IHVwIGZvZyBpZiBuZWVkZWQuLi4KKyAgICAgICAgaXRlcmF0b3JzWzBdID0gYy0+Zm9nLmZvZyhjLCBadyk7CisgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZm9nR3JhZDN4dihjLCBpdGVyYXRvcnMpOworICAgIH0KKyAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfREVQVEhfVEVTVCkgeworICAgICAgICAvLyBzZXQgdXAgei10ZXN0IGlmIG5lZWRlZC4uLgorICAgICAgICBpbnQzMl90IHogPSAoWncgJiB+KFp3Pj4zMSkpOworICAgICAgICBpZiAoeiA+PSAweDEwMDAwKQorICAgICAgICAgICAgeiA9IDB4RkZGRjsKKyAgICAgICAgaXRlcmF0b3JzWzBdID0gKHogPDwgMTYpIHwgejsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy56R3JhZDN4dihjLCBpdGVyYXRvcnMpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgR2VuZXJhdGUgbWltYXBzCisjZW5kaWYKKworZXh0ZXJuIHN0YXR1c190IGJ1aWxkQVB5cmFtaWQob2dsZXNfY29udGV4dF90KiBjLCBFR0xUZXh0dXJlT2JqZWN0KiB0ZXgpOworCit2b2lkIGdlbmVyYXRlTWlwbWFwKG9nbGVzX2NvbnRleHRfdCogYywgR0xpbnQgbGV2ZWwpCit7CisgICAgaWYgKGxldmVsID09IDApIHsKKyAgICAgICAgY29uc3QgaW50IGFjdGl2ZSA9IGMtPnRleHR1cmVzLmFjdGl2ZTsKKyAgICAgICAgRUdMVGV4dHVyZU9iamVjdCogdGV4ID0gYy0+dGV4dHVyZXMudG11W2FjdGl2ZV0udGV4dHVyZTsKKyAgICAgICAgaWYgKHRleC0+Z2VuZXJhdGVfbWlwbWFwKSB7CisgICAgICAgICAgICBpZiAoYnVpbGRBUHlyYW1pZChjLCB0ZXgpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfT1VUX09GX01FTU9SWSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIHRleFBhcmFtZXRlcngoCisgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSwgb2dsZXNfY29udGV4dF90KiBjKQoreworICAgIGlmICh0YXJnZXQgIT0gR0xfVEVYVFVSRV8yRCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIEVHTFRleHR1cmVPYmplY3QqIHRleHR1cmVPYmplY3QgPSBjLT50ZXh0dXJlcy50bXVbYy0+dGV4dHVyZXMuYWN0aXZlXS50ZXh0dXJlOyAgICAKKyAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgY2FzZSBHTF9URVhUVVJFX1dSQVBfUzoKKyAgICAgICAgaWYgKChwYXJhbSA9PSBHTF9SRVBFQVQpIHx8CisgICAgICAgICAgICAocGFyYW0gPT0gR0xfQ0xBTVBfVE9fRURHRSkpIHsKKyAgICAgICAgICAgIHRleHR1cmVPYmplY3QtPndyYXBzID0gcGFyYW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnb3RvIGludmFsaWRfZW51bTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1RFWFRVUkVfV1JBUF9UOgorICAgICAgICBpZiAoKHBhcmFtID09IEdMX1JFUEVBVCkgfHwKKyAgICAgICAgICAgIChwYXJhbSA9PSBHTF9DTEFNUF9UT19FREdFKSkgeworICAgICAgICAgICAgdGV4dHVyZU9iamVjdC0+d3JhcHQgPSBwYXJhbTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdvdG8gaW52YWxpZF9lbnVtOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfVEVYVFVSRV9NSU5fRklMVEVSOgorICAgICAgICBpZiAoKHBhcmFtID09IEdMX05FQVJFU1QpIHx8CisgICAgICAgICAgICAocGFyYW0gPT0gR0xfTElORUFSKSB8fAorICAgICAgICAgICAgKHBhcmFtID09IEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QpIHx8CisgICAgICAgICAgICAocGFyYW0gPT0gR0xfTElORUFSX01JUE1BUF9ORUFSRVNUKSB8fAorICAgICAgICAgICAgKHBhcmFtID09IEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUikgfHwKKyAgICAgICAgICAgIChwYXJhbSA9PSBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUikpIHsKKyAgICAgICAgICAgIHRleHR1cmVPYmplY3QtPm1pbl9maWx0ZXIgPSBwYXJhbTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdvdG8gaW52YWxpZF9lbnVtOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfVEVYVFVSRV9NQUdfRklMVEVSOgorICAgICAgICBpZiAoKHBhcmFtID09IEdMX05FQVJFU1QpIHx8CisgICAgICAgICAgICAocGFyYW0gPT0gR0xfTElORUFSKSkgeworICAgICAgICAgICAgdGV4dHVyZU9iamVjdC0+bWFnX2ZpbHRlciA9IHBhcmFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ290byBpbnZhbGlkX2VudW07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9HRU5FUkFURV9NSVBNQVA6CisgICAgICAgIHRleHR1cmVPYmplY3QtPmdlbmVyYXRlX21pcG1hcCA9IHBhcmFtOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgoraW52YWxpZF9lbnVtOgorICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludmFsaWRhdGVfdGV4dHVyZShjLCBjLT50ZXh0dXJlcy5hY3RpdmUpOworfQorCisKK3N0YXRpYyB2b2lkIGRyYXdUZXh4T0VTKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgdywgR0xmaXhlZCBoLAorICAgICAgICBvZ2xlc19jb250ZXh0X3QqIGMpCit7CisgICAgLy8gcXVpY2tseSByZWplY3QgZW1wdHkgcmVjdHMKKyAgICBpZiAoKHd8aCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAKKworICAgIGNvbnN0IEdHTFN1cmZhY2UmIGNiU3VyZmFjZSA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5jb2xvci5zOworICAgIHkgPSBnZ2xJbnRUb0ZpeGVkKGNiU3VyZmFjZS5oZWlnaHQpIC0gKHkgKyBoKTsKKyAgICB3ID4+PSBGSVhFRF9CSVRTOworICAgIGggPj49IEZJWEVEX0JJVFM7CisKKyAgICAvLyBzZXQgdXAgYWxsIHRleHR1cmUgdW5pdHMKKyAgICBmb3IgKGludCBpPTAgOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKKyAgICAgICAgaWYgKCFjLT5yYXN0ZXJpemVyLnN0YXRlLnRleHR1cmVbaV0uZW5hYmxlKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaW50MzJfdCB0ZXhjb29yZHNbOF07CisgICAgICAgIHRleHR1cmVfdW5pdF90JiB1KGMtPnRleHR1cmVzLnRtdVtpXSk7CisKKyAgICAgICAgLy8gdmFsaWRhdGUgdGhpcyB0bXUgKGJpbmQsIHdyYXAsIGZpbHRlcikKKyAgICAgICAgdmFsaWRhdGVfdG11KGMsIGkpOworICAgICAgICAvLyB3ZSBDTEFNUCBoZXJlLCB3aGljaCB3b3JrcyB3aXRoIHByZW11bHRpcGxpZWQgKHMsdCkKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhQYXJhbWV0ZXJpKGMsCisgICAgICAgICAgICAgICAgR0dMX1RFWFRVUkVfMkQsIEdHTF9URVhUVVJFX1dSQVBfUywgR0dMX0NMQU1QKTsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhQYXJhbWV0ZXJpKGMsCisgICAgICAgICAgICAgICAgR0dMX1RFWFRVUkVfMkQsIEdHTF9URVhUVVJFX1dSQVBfVCwgR0dMX0NMQU1QKTsKKyAgICAgICAgdS5kaXJ0eSA9IDB4RkY7IC8vIFhYWDogc2hvdWxkIGJlIG1vcmUgc3VidGxlCisKKyAgICAgICAgRUdMVGV4dHVyZU9iamVjdCogdGV4dHVyZU9iamVjdCA9IHUudGV4dHVyZTsgIAorICAgICAgICBjb25zdCBHTGludCBVY3IgPSB0ZXh0dXJlT2JqZWN0LT5jcm9wX3JlY3RbMF0gPDwgMTY7CisgICAgICAgIGNvbnN0IEdMaW50IFZjciA9IHRleHR1cmVPYmplY3QtPmNyb3BfcmVjdFsxXSA8PCAxNjsKKyAgICAgICAgY29uc3QgR0xpbnQgV2NyID0gdGV4dHVyZU9iamVjdC0+Y3JvcF9yZWN0WzJdIDw8IDE2OworICAgICAgICBjb25zdCBHTGludCBIY3IgPSB0ZXh0dXJlT2JqZWN0LT5jcm9wX3JlY3RbM10gPDwgMTY7CisKKyAgICAgICAgLy8gY29tcHV0ZXMgdGV4dHVyZSBjb29yZGluYXRlcyAocHJlLW11bHRpcGxpZWQpCisgICAgICAgIGludDMyX3QgZHNkeCA9IFdjciAvIHc7ICAgLy8gZHNkeCA9ICAoKFdjci93KS9XdCkqV3QKKyAgICAgICAgaW50MzJfdCBkdGR5ID0tSGNyIC8gaDsgICAvLyBkdGR5ID0gLSgoSGNyL2gpL0h0KSpIdAorICAgICAgICBpbnQzMl90IHMwICAgPSBVY3IgICAgICAgLSBnZ2xNdWx4KGRzZHgsIHgpOyAvLyBzMCA9IFVjciAtIHggKiBkc2R4CisgICAgICAgIGludDMyX3QgdDAgICA9IChWY3IrSGNyKSAtIGdnbE11bHgoZHRkeSwgeSk7IC8vIHQwID0gKFZjcitIY3IpIC0geSpkdGR5CisgICAgICAgIHRleGNvb3Jkc1swXSA9IHMwOworICAgICAgICB0ZXhjb29yZHNbMV0gPSBkc2R4OworICAgICAgICB0ZXhjb29yZHNbMl0gPSAwOworICAgICAgICB0ZXhjb29yZHNbM10gPSB0MDsKKyAgICAgICAgdGV4Y29vcmRzWzRdID0gMDsKKyAgICAgICAgdGV4Y29vcmRzWzVdID0gZHRkeTsKKyAgICAgICAgdGV4Y29vcmRzWzZdID0gMDsKKyAgICAgICAgdGV4Y29vcmRzWzddID0gMDsKKyAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhDb29yZEdyYWRTY2FsZTh4dihjLCBpLCB0ZXhjb29yZHMpOworICAgIH0KKworICAgIGNvbnN0IHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7CisgICAgaWYgKGdnbF91bmxpa2VseShlbmFibGVzICYgKEdHTF9FTkFCTEVfREVQVEhfVEVTVHxHR0xfRU5BQkxFX0ZPRykpKQorICAgICAgICBzZXRfZGVwdGhfYW5kX2ZvZyhjLCB6KTsKKworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWN0aXZlVGV4dHVyZShjLCBjLT50ZXh0dXJlcy5hY3RpdmUpOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3I0eHYoYywgYy0+Y3VycmVudENvbG9yQ2xhbXBlZC52KTsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmRpc2FibGUoYywgR0dMX1dfTEVSUCk7CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5kaXNhYmxlKGMsIEdHTF9BQSk7CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy5zaGFkZU1vZGVsKGMsIEdMX0ZMQVQpOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MucmVjdGkoYywgCisgICAgICAgICAgICBnZ2xGaXhlZFRvSW50Um91bmQoeCksCisgICAgICAgICAgICBnZ2xGaXhlZFRvSW50Um91bmQoeSksCisgICAgICAgICAgICBnZ2xGaXhlZFRvSW50Um91bmQoeCkrdywKKyAgICAgICAgICAgIGdnbEZpeGVkVG9JbnRSb3VuZCh5KStoKTsKK30KKworc3RhdGljIHZvaWQgZHJhd1RleGlPRVMoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdywgR0xpbnQgaCwgb2dsZXNfY29udGV4dF90KiBjKQoreworICAgIC8vIEFsbCBjb29yZGluYXRlcyBhcmUgaW50ZWdlciwgc28gaWYgd2UgaGF2ZSBvbmx5IG9uZQorICAgIC8vIHRleHR1cmUgdW5pdCBhY3RpdmUgYW5kIG5vIHNjYWxpbmcgaXMgcmVxdWlyZWQKKyAgICAvLyBUSEVOLCB3ZSBjYW4gdXNlIG91ciBzcGVjaWFsIDE6MSBtYXBwaW5nCisgICAgLy8gd2hpY2ggaXMgYSBsb3QgZmFzdGVyLgorCisgICAgaWYgKGdnbF9saWtlbHkoYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVkX3RtdSA9PSAxKSkgeworICAgICAgICBjb25zdCBpbnQgdG11ID0gMDsKKyAgICAgICAgdGV4dHVyZV91bml0X3QmIHUoYy0+dGV4dHVyZXMudG11W3RtdV0pOworICAgICAgICBFR0xUZXh0dXJlT2JqZWN0KiB0ZXh0dXJlT2JqZWN0ID0gdS50ZXh0dXJlOyAgCisgICAgICAgIGNvbnN0IEdMaW50IFdjciA9IHRleHR1cmVPYmplY3QtPmNyb3BfcmVjdFsyXTsKKyAgICAgICAgY29uc3QgR0xpbnQgSGNyID0gdGV4dHVyZU9iamVjdC0+Y3JvcF9yZWN0WzNdOworCisgICAgICAgIGlmICgodyA9PSBXY3IpICYmIChoID09IC1IY3IpKSB7CisgICAgICAgICAgICBpZiAoKHd8aCkgPD0gMCkgcmV0dXJuOyAvLyBxdWlja2x5IHJlamVjdCBlbXB0eSByZWN0cworCisgICAgICAgICAgICBpZiAodS5kaXJ0eSkgeworICAgICAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWN0aXZlVGV4dHVyZShjLCB0bXUpOworICAgICAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYmluZFRleHR1cmUoYywgJih1LnRleHR1cmUtPnN1cmZhY2UpKTsKKyAgICAgICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleFBhcmFtZXRlcmkoYywgR0dMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICAgICAgICAgICAgICBHR0xfVEVYVFVSRV9NSU5fRklMVEVSLCB1LnRleHR1cmUtPm1pbl9maWx0ZXIpOworICAgICAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4UGFyYW1ldGVyaShjLCBHR0xfVEVYVFVSRV8yRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX01BR19GSUxURVIsIHUudGV4dHVyZS0+bWFnX2ZpbHRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleEdlbmkoYywgR0dMX1MsCisgICAgICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX0dFTl9NT0RFLCBHR0xfT05FX1RPX09ORSk7CisgICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleEdlbmkoYywgR0dMX1QsCisgICAgICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX0dFTl9NT0RFLCBHR0xfT05FX1RPX09ORSk7CisgICAgICAgICAgICB1LmRpcnR5ID0gMHhGRjsgLy8gWFhYOiBzaG91bGQgYmUgbW9yZSBzdWJ0bGUKKyAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWN0aXZlVGV4dHVyZShjLCBjLT50ZXh0dXJlcy5hY3RpdmUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjb25zdCBHR0xTdXJmYWNlJiBjYlN1cmZhY2UgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuY29sb3IuczsKKyAgICAgICAgICAgIHkgPSBjYlN1cmZhY2UuaGVpZ2h0IC0gKHkgKyBoKTsKKyAgICAgICAgICAgIGNvbnN0IEdMaW50IFVjciA9IHRleHR1cmVPYmplY3QtPmNyb3BfcmVjdFswXTsKKyAgICAgICAgICAgIGNvbnN0IEdMaW50IFZjciA9IHRleHR1cmVPYmplY3QtPmNyb3BfcmVjdFsxXTsKKyAgICAgICAgICAgIGNvbnN0IEdMaW50IHMwICA9IFVjciAtIHg7CisgICAgICAgICAgICBjb25zdCBHTGludCB0MCAgPSAoVmNyICsgSGNyKSAtIHk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbnN0IEdMdWludCB0dyA9IHRleHR1cmVPYmplY3QtPnN1cmZhY2Uud2lkdGg7CisgICAgICAgICAgICBjb25zdCBHTHVpbnQgdGggPSB0ZXh0dXJlT2JqZWN0LT5zdXJmYWNlLmhlaWdodDsKKyAgICAgICAgICAgIGlmICgodWludDMyX3QoczAreCt3KSA+IHR3KSB8fCAodWludDMyX3QodDAreStoKSA+IHRoKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBHTCBzcGVjIGlzIHVuY2xlYXIgYWJvdXQgd2hhdCBzaG91bGQgaGFwcGVuCisgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlLCBzbyB3ZSBqdXN0IHVzZSB0aGUgc2xvdyBjYXNlLCB3aGljaAorICAgICAgICAgICAgICAgIC8vIGF0IGxlYXN0IHdvbid0IGNyYXNoCisgICAgICAgICAgICAgICAgZ290byBzbG93X2Nhc2U7CisgICAgICAgICAgICB9IAorCisgICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleENvb3JkMmkoYywgczAsIHQwKTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7CisgICAgICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KGVuYWJsZXMgJiAoR0dMX0VOQUJMRV9ERVBUSF9URVNUfEdHTF9FTkFCTEVfRk9HKSkpCisgICAgICAgICAgICAgICAgc2V0X2RlcHRoX2FuZF9mb2coYywgeik7CisKKyAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3I0eHYoYywgYy0+Y3VycmVudENvbG9yQ2xhbXBlZC52KTsKKyAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZGlzYWJsZShjLCBHR0xfV19MRVJQKTsKKyAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZGlzYWJsZShjLCBHR0xfQUEpOworICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5zaGFkZU1vZGVsKGMsIEdMX0ZMQVQpOworICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5yZWN0aShjLCB4LCB5LCB4K3csIHkraCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKK3Nsb3dfY2FzZToKKyAgICBkcmF3VGV4eE9FUygKKyAgICAgICAgICAgIGdnbEludFRvRml4ZWQoeCksIGdnbEludFRvRml4ZWQoeSksIGdnbEludFRvRml4ZWQoeiksCisgICAgICAgICAgICBnZ2xJbnRUb0ZpeGVkKHcpLCBnZ2xJbnRUb0ZpeGVkKGgpLAorICAgICAgICAgICAgYyk7Cit9CisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKworI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjcHJhZ21hIG1hcmsgVGV4dHVyZSBBUEkKKyNlbmRpZgorCit2b2lkIGdsQWN0aXZlVGV4dHVyZShHTGVudW0gdGV4dHVyZSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmICh1aW50MzJfdCh0ZXh0dXJlLUdMX1RFWFRVUkUwKSA+IHVpbnQzMl90KEdHTF9URVhUVVJFX1VOSVRfQ09VTlQpKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+dGV4dHVyZXMuYWN0aXZlID0gdGV4dHVyZSAtIEdMX1RFWFRVUkUwOworICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWN0aXZlVGV4dHVyZShjLCBjLT50ZXh0dXJlcy5hY3RpdmUpOworfQorCit2b2lkIGdsQmluZFRleHR1cmUoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAodGFyZ2V0ICE9IEdMX1RFWFRVUkVfMkQpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEJpbmQgb3IgY3JlYXRlIGEgdGV4dHVyZQorICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+IHRleDsgICAgCisgICAgaWYgKHRleHR1cmUgPT0gMCkgeworICAgICAgICAvLyAwIGlzIG91ciBsb2NhbCB0ZXh0dXJlIG9iamVjdAorICAgICAgICB0ZXggPSBjLT50ZXh0dXJlcy5kZWZhdWx0VGV4dHVyZTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXggPSBjLT5zdXJmYWNlTWFuYWdlci0+dGV4dHVyZSh0ZXh0dXJlKTsKKyAgICAgICAgaWYgKGdnbF91bmxpa2VseSh0ZXggPT0gMCkpIHsKKyAgICAgICAgICAgIHRleCA9IGMtPnN1cmZhY2VNYW5hZ2VyLT5jcmVhdGVUZXh0dXJlKHRleHR1cmUpOworICAgICAgICAgICAgaWYgKHRleCA9PSAwKSB7CisgICAgICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfT1VUX09GX01FTU9SWSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGJpbmRUZXh0dXJlVG11KGMsIGMtPnRleHR1cmVzLmFjdGl2ZSwgdGV4dHVyZSwgdGV4KTsKK30KKwordm9pZCBnbEdlblRleHR1cmVzKEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmIChuPDApIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gZ2VuZXJhdGUgdW5pcXVlIChzaGFyZWQpIHRleHR1cmUgbmFtZXMKKyAgICBjLT5zdXJmYWNlTWFuYWdlci0+Z2V0VG9rZW4obiwgdGV4dHVyZXMpOworfQorCit2b2lkIGdsRGVsZXRlVGV4dHVyZXMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKG48MCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElmIGRlbGV0aW5nIGEgYm91bmQgdGV4dHVyZSwgYmluZCB0aGlzIHVuaXQgdG8gMAorICAgIGZvciAoaW50IHQ9MCA7IHQ8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IHQrKykgeworICAgICAgICBpZiAoYy0+dGV4dHVyZXMudG11W3RdLm5hbWUgPT0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKGludCBpPTAgOyBpPG4gOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0ZXh0dXJlc1tpXSAmJiAodGV4dHVyZXNbaV0gPT0gYy0+dGV4dHVyZXMudG11W3RdLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gYmluZCB0aGlzIHRtdSB0byB0ZXh0dXJlIDAKKyAgICAgICAgICAgICAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiB0ZXgoYy0+dGV4dHVyZXMuZGVmYXVsdFRleHR1cmUpOworICAgICAgICAgICAgICAgIGJpbmRUZXh0dXJlVG11KGMsIHQsIDAsIHRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgYy0+c3VyZmFjZU1hbmFnZXItPmRlbGV0ZVRleHR1cmVzKG4sIHRleHR1cmVzKTsKKyAgICBjLT5zdXJmYWNlTWFuYWdlci0+cmVjeWNsZVRva2VucyhuLCB0ZXh0dXJlcyk7Cit9CisKK3ZvaWQgZ2xNdWx0aVRleENvb3JkNGYoCisgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmICh1aW50MzJfdCh0YXJnZXQtR0xfVEVYVFVSRTApID4gdWludDMyX3QoR0dMX1RFWFRVUkVfVU5JVF9DT1VOVCkpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBpbnQgdG11ID0gdGFyZ2V0LUdMX1RFWFRVUkUwOworICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlMgPSBnZ2xGbG9hdFRvRml4ZWQocyk7CisgICAgYy0+Y3VycmVudC50ZXh0dXJlW3RtdV0uVCA9IGdnbEZsb2F0VG9GaXhlZCh0KTsKKyAgICBjLT5jdXJyZW50LnRleHR1cmVbdG11XS5SID0gZ2dsRmxvYXRUb0ZpeGVkKHIpOworICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlEgPSBnZ2xGbG9hdFRvRml4ZWQocSk7Cit9CisKK3ZvaWQgZ2xNdWx0aVRleENvb3JkNHgoCisgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmICh1aW50MzJfdCh0YXJnZXQtR0xfVEVYVFVSRTApID4gdWludDMyX3QoR0dMX1RFWFRVUkVfVU5JVF9DT1VOVCkpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBpbnQgdG11ID0gdGFyZ2V0LUdMX1RFWFRVUkUwOworICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlMgPSBzOworICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlQgPSB0OworICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlIgPSByOworICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlEgPSBxOworfQorCit2b2lkIGdsUGl4ZWxTdG9yZWkoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmICgocG5hbWUgIT0gR0xfUEFDS19BTElHTk1FTlQpICYmIChwbmFtZSAhPSBHTF9VTlBBQ0tfQUxJR05NRU5UKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfSAgICAKKyAgICBpZiAoKHBhcmFtPD0wIHx8IHBhcmFtPjgpIHx8IChwYXJhbSAmIChwYXJhbS0xKSkpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBuYW1lID09IEdMX1BBQ0tfQUxJR05NRU5UKQorICAgICAgICBjLT50ZXh0dXJlcy5wYWNrQWxpZ25tZW50ID0gcGFyYW07CisgICAgaWYgKHBuYW1lID09IEdMX1VOUEFDS19BTElHTk1FTlQpCisgICAgICAgIGMtPnRleHR1cmVzLnVucGFja0FsaWdubWVudCA9IHBhcmFtOworfQorCit2b2lkIGdsVGV4RW52ZihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleEVudmkoYywgdGFyZ2V0LCBwbmFtZSwgR0xpbnQocGFyYW0pKTsKK30KKwordm9pZCBnbFRleEVudmZ2KAorICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmIChwbmFtZSA9PSBHTF9URVhUVVJFX0VOVl9NT0RFKSB7CisgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4RW52aShjLCB0YXJnZXQsIHBuYW1lLCBHTGludCgqcGFyYW1zKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBuYW1lID09IEdMX1RFWFRVUkVfRU5WX0NPTE9SKSB7CisgICAgICAgIEdHTGZpeGVkIGZpeGVkWzRdOworICAgICAgICBmb3IgKGludCBpPTAgOyBpPDQgOyBpKyspCisgICAgICAgICAgICBmaXhlZFtpXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbaV0pOworICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleEVudnh2KGMsIHRhcmdldCwgcG5hbWUsIGZpeGVkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworfQorCit2b2lkIGdsVGV4RW52eChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleEVudmkoYywgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworfQorCit2b2lkIGdsVGV4RW52eHYoCisgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhFbnZ4dihjLCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworfQorCit2b2lkIGdsVGV4UGFyYW1ldGVyaXYoCisgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQqIHBhcmFtcykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmICh0YXJnZXQgIT0gR0dMX1RFWFRVUkVfMkQpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEVHTFRleHR1cmVPYmplY3QqIHRleHR1cmVPYmplY3QgPSBjLT50ZXh0dXJlcy50bXVbYy0+dGV4dHVyZXMuYWN0aXZlXS50ZXh0dXJlOworICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUzoKKyAgICAgICAgbWVtY3B5KHRleHR1cmVPYmplY3QtPmNyb3BfcmVjdCwgcGFyYW1zLCA0KnNpemVvZihHTGludCkpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCit2b2lkIGdsVGV4UGFyYW1ldGVyZigKKyAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgdGV4UGFyYW1ldGVyeCh0YXJnZXQsIHBuYW1lLCBHTGZpeGVkKHBhcmFtKSwgYyk7Cit9CisKK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJ4KAorICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICB0ZXhQYXJhbWV0ZXJ4KHRhcmdldCwgcG5hbWUsIHBhcmFtLCBjKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKKyNwcmFnbWEgbWFyayAtCisjZW5kaWYKKwordm9pZCBnbENvbXByZXNzZWRUZXhJbWFnZTJEKAorICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LAorICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLAorICAgICAgICBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKHRhcmdldCAhPSBHTF9URVhUVVJFXzJEKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKChpbnRlcm5hbGZvcm1hdCA8IEdMX1BBTEVUVEU0X1JHQjhfT0VTIHx8CisgICAgICAgICBpbnRlcm5hbGZvcm1hdCA+IEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTKSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh3aWR0aDwwIHx8IGhlaWdodDwwIHx8IGJvcmRlciE9MCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vICJ1bmNvbXByZXNzIiB0aGUgdGV4dHVyZSBzaW5jZSBwaXhlbGZsaW5nZXIgZG9lc24ndCBzdXBwb3J0CisgICAgLy8gYW55IGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgbmF0aXZlbHkuIAorICAgIEdMZW51bSBmb3JtYXQ7CisgICAgR0xlbnVtIHR5cGU7CisgICAgc3dpdGNoIChpbnRlcm5hbGZvcm1hdCkgeworICAgIGNhc2UgR0xfUEFMRVRURThfUkdCOF9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFNF9SR0I4X09FUzoKKyAgICAgICAgZm9ybWF0ICAgICAgPSBHTF9SR0I7CisgICAgICAgIHR5cGUgICAgICAgID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9QQUxFVFRFOF9SR0JBOF9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFNF9SR0JBOF9PRVM6CisgICAgICAgIGZvcm1hdCAgICAgID0gR0xfUkdCQTsKKyAgICAgICAgdHlwZSAgICAgICAgPSBHTF9VTlNJR05FRF9CWVRFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUzoKKyAgICAgICAgZm9ybWF0ICAgICAgPSBHTF9SR0I7CisgICAgICAgIHR5cGUgICAgICAgID0gR0xfVU5TSUdORURfU0hPUlRfNV82XzU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfUEFMRVRURThfUkdCQTRfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCQTRfT0VTOgorICAgICAgICBmb3JtYXQgICAgICA9IEdMX1JHQkE7CisgICAgICAgIHR5cGUgICAgICAgID0gR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTOgorICAgICAgICBmb3JtYXQgICAgICA9IEdMX1JHQkE7CisgICAgICAgIHR5cGUgICAgICAgID0gR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghZGF0YSB8fCAhd2lkdGggfHwgIWhlaWdodCkgeworICAgICAgICAvLyB1bmNsZWFyIGlmIHRoaXMgaXMgYW4gZXJyb3Igb3Igbm90Li4uCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IHNpemU7CisgICAgR0dMU3VyZmFjZSogc3VyZmFjZTsKKyAgICAvLyBhbGwgbWlwbWFwIGxldmVscyBhcmUgc3BlY2lmaWVkIGF0IG9uY2UuCisgICAgY29uc3QgaW50IG51bUxldmVscyA9IGxldmVsPDAgPyAtbGV2ZWwgOiAxOworICAgIGZvciAoaW50IGk9MCA7IGk8bnVtTGV2ZWxzIDsgaSsrKSB7CisgICAgICAgIGludCBsb2RfdyA9ICh3aWR0aCAgPj4gaSkgPyA6IDE7CisgICAgICAgIGludCBsb2RfaCA9IChoZWlnaHQgPj4gaSkgPyA6IDE7CisgICAgICAgIGludCBlcnJvciA9IGNyZWF0ZVRleHR1cmVTdXJmYWNlKGMsICZzdXJmYWNlLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICBpLCBmb3JtYXQsIHR5cGUsIGxvZF93LCBsb2RfaCk7CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgZXJyb3IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGRlY29kZVBhbGV0dGU0KGRhdGEsIGksIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgc3VyZmFjZS0+ZGF0YSwgc3VyZmFjZS0+c3RyaWRlLCBpbnRlcm5hbGZvcm1hdCk7CisgICAgfQorfQorCisKK3ZvaWQgZ2xUZXhJbWFnZTJEKAorICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsCisgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsCisgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscykKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGlmICh0YXJnZXQgIT0gR0xfVEVYVFVSRV8yRCAmJiB0YXJnZXQgIT0gR0xfRElSRUNUX1RFWFRVUkVfMkRfUVVBTENPTU0pIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAod2lkdGg8MCB8fCBoZWlnaHQ8MCB8fCBib3JkZXIhPTAgfHwgbGV2ZWwgPCAwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChmb3JtYXQgIT0gaW50ZXJuYWxmb3JtYXQpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh2YWxpZEZvcm1hdFR5cGUoYywgZm9ybWF0LCB0eXBlKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBzaXplID0gMDsKKyAgICBHR0xTdXJmYWNlKiBzdXJmYWNlID0gMDsKKyAgICBpZiAodGFyZ2V0ICE9IEdMX0RJUkVDVF9URVhUVVJFXzJEX1FVQUxDT01NKSB7CisgICAgICAgIGludCBlcnJvciA9IGNyZWF0ZVRleHR1cmVTdXJmYWNlKGMsICZzdXJmYWNlLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICBsZXZlbCwgZm9ybWF0LCB0eXBlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBlcnJvcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHBpeGVscyA9PSAwIHx8IGxldmVsICE9IDApIHsKKyAgICAgICAgLy8gcGl4ZWwgY2FuJ3QgYmUgbnVsbCBmb3IgZGlyZWN0IHRleHR1cmUKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHBpeGVscykgeworICAgICAgICBjb25zdCBpbnQzMl90IGZvcm1hdElkeCA9IGNvbnZlcnRHTFBpeGVsRm9ybWF0KGZvcm1hdCwgdHlwZSk7CisgICAgICAgIGNvbnN0IEdHTEZvcm1hdCYgcGl4ZWxGb3JtYXQoYy0+cmFzdGVyaXplci5mb3JtYXRzW2Zvcm1hdElkeF0pOworICAgICAgICBjb25zdCBpbnQzMl90IGFsaWduID0gYy0+dGV4dHVyZXMudW5wYWNrQWxpZ25tZW50LTE7CisgICAgICAgIGNvbnN0IGludDMyX3QgYnByID0gKCh3aWR0aCAqIHBpeGVsRm9ybWF0LnNpemUpICsgYWxpZ24pICYgfmFsaWduOworICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IGJwciAqIGhlaWdodDsKKyAgICAgICAgY29uc3QgaW50MzJfdCBzdHJpZGUgPSBicHIgLyBwaXhlbEZvcm1hdC5zaXplOworCisgICAgICAgIEdHTFN1cmZhY2UgdXNlclN1cmZhY2U7CisgICAgICAgIHVzZXJTdXJmYWNlLnZlcnNpb24gPSBzaXplb2YodXNlclN1cmZhY2UpOworICAgICAgICB1c2VyU3VyZmFjZS53aWR0aCAgPSB3aWR0aDsKKyAgICAgICAgdXNlclN1cmZhY2UuaGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICB1c2VyU3VyZmFjZS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIHVzZXJTdXJmYWNlLmZvcm1hdCA9IGZvcm1hdElkeDsKKyAgICAgICAgdXNlclN1cmZhY2UuY29tcHJlc3NlZEZvcm1hdCA9IDA7CisgICAgICAgIHVzZXJTdXJmYWNlLmRhdGEgPSAoR0x1Ynl0ZSopcGl4ZWxzOworCisgICAgICAgIGlmICh0YXJnZXQgIT0gR0xfRElSRUNUX1RFWFRVUkVfMkRfUVVBTENPTU0pIHsKKyAgICAgICAgICAgIGludCBlcnIgPSBjb3B5UGl4ZWxzKGMsICpzdXJmYWNlLCAwLCAwLCB1c2VyU3VyZmFjZSwgMCwgMCwgd2lkdGgsIGhlaWdodCk7IAorICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgIG9nbGVzX2Vycm9yKGMsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2VuZXJhdGVNaXBtYXAoYywgbGV2ZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gYmluZCBpdCB0byB0aGUgdGV4dHVyZSB1bml0CisgICAgICAgICAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiB0ZXggPSBnZXRBbmRCaW5kQWN0aXZlVGV4dHVyZU9iamVjdChjKTsKKyAgICAgICAgICAgIHRleC0+c2V0U3VyZmFjZSgmdXNlclN1cmZhY2UpOworICAgICAgICB9CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCgKKyAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsCisgICAgICAgIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwKKyAgICAgICAgY29uc3QgR0x2b2lkICpkYXRhKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKK30KKwordm9pZCBnbFRleFN1YkltYWdlMkQoCisgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LAorICAgICAgICBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKHRhcmdldCAhPSBHTF9URVhUVVJFXzJEKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHhvZmZzZXQ8MCB8fCB5b2Zmc2V0PDAgfHwgd2lkdGg8MCB8fCBoZWlnaHQ8MCB8fCBsZXZlbDwwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh2YWxpZEZvcm1hdFR5cGUoYywgZm9ybWF0LCB0eXBlKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gZmluZCBvdXQgd2hpY2ggdGV4dHVyZSBpcyBib3VuZCB0byB0aGUgY3VycmVudCB1bml0CisgICAgY29uc3QgaW50IGFjdGl2ZSA9IGMtPnRleHR1cmVzLmFjdGl2ZTsKKyAgICBFR0xUZXh0dXJlT2JqZWN0KiB0ZXggPSBjLT50ZXh0dXJlcy50bXVbYWN0aXZlXS50ZXh0dXJlOworICAgIGNvbnN0IEdHTFN1cmZhY2UmIHN1cmZhY2UodGV4LT5taXAobGV2ZWwpKTsKKworICAgIGlmICghdGV4LT5pbnRlcm5hbGZvcm1hdCB8fCB0ZXgtPmRpcmVjdCkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCh4b2Zmc2V0ICsgd2lkdGggID4gR0xzaXplaShzdXJmYWNlLndpZHRoKSkgfHwKKyAgICAgICAgKHlvZmZzZXQgKyBoZWlnaHQgPiBHTHNpemVpKHN1cmZhY2UuaGVpZ2h0KSkpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSB7CisgICAgICAgIHJldHVybjsgLy8gb2theSwgYnV0IG5vLW9wLgorICAgIH0KKworICAgIC8vIGZpZ3VyZSBvdXQgdGhlIHNpemUgd2UgbmVlZCBhcyB3ZWxsIGFzIHRoZSBzdHJpZGUKKyAgICBjb25zdCBpbnQzMl90IGZvcm1hdElkeCA9IGNvbnZlcnRHTFBpeGVsRm9ybWF0KGZvcm1hdCwgdHlwZSk7CisgICAgaWYgKGZvcm1hdElkeCA9PSAwKSB7IC8vIHdlIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoaXMKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgR0dMRm9ybWF0JiBwaXhlbEZvcm1hdChjLT5yYXN0ZXJpemVyLmZvcm1hdHNbZm9ybWF0SWR4XSk7CisgICAgY29uc3QgaW50MzJfdCBhbGlnbiA9IGMtPnRleHR1cmVzLnVucGFja0FsaWdubWVudC0xOworICAgIGNvbnN0IGludDMyX3QgYnByID0gKCh3aWR0aCAqIHBpeGVsRm9ybWF0LnNpemUpICsgYWxpZ24pICYgfmFsaWduOworICAgIGNvbnN0IHNpemVfdCBzaXplID0gYnByICogaGVpZ2h0OworICAgIGNvbnN0IGludDMyX3Qgc3RyaWRlID0gYnByIC8gcGl4ZWxGb3JtYXQuc2l6ZTsKKyAgICBHR0xTdXJmYWNlIHVzZXJTdXJmYWNlOworICAgIHVzZXJTdXJmYWNlLnZlcnNpb24gPSBzaXplb2YodXNlclN1cmZhY2UpOworICAgIHVzZXJTdXJmYWNlLndpZHRoICA9IHdpZHRoOworICAgIHVzZXJTdXJmYWNlLmhlaWdodCA9IGhlaWdodDsKKyAgICB1c2VyU3VyZmFjZS5zdHJpZGUgPSBzdHJpZGU7CisgICAgdXNlclN1cmZhY2UuZm9ybWF0ID0gZm9ybWF0SWR4OworICAgIHVzZXJTdXJmYWNlLmNvbXByZXNzZWRGb3JtYXQgPSAwOworICAgIHVzZXJTdXJmYWNlLmRhdGEgPSAoR0x1Ynl0ZSopcGl4ZWxzOworCisgICAgaW50IGVyciA9IGNvcHlQaXhlbHMoYywKKyAgICAgICAgICAgIHN1cmZhY2UsIHhvZmZzZXQsIHlvZmZzZXQsCisgICAgICAgICAgICB1c2VyU3VyZmFjZSwgMCwgMCwgd2lkdGgsIGhlaWdodCk7IAorICAgIGlmIChlcnIpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdlbmVyYXRlTWlwbWFwKGMsIGxldmVsKTsKKworICAgIC8vIHNpbmNlIHdlIG9ubHkgY2hhbmdlZCB0aGUgY29udGVudCBvZiB0aGUgdGV4dHVyZSwgd2UgZG9uJ3QgbmVlZAorICAgIC8vIHRvIGNhbGwgYmluZFRleHR1cmUgb24gdGhlIG1haW4gcmFzdGVyaXplci4KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIGdsQ29weVRleEltYWdlMkQoCisgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsCisgICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICBHTGludCBib3JkZXIpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAodGFyZ2V0ICE9IEdMX1RFWFRVUkVfMkQpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoaW50ZXJuYWxmb3JtYXQ8R0xfQUxQSEEgfHwgaW50ZXJuYWxmb3JtYXQ+R0xfTFVNSU5BTkNFX0FMUEhBKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHdpZHRoPDAgfHwgaGVpZ2h0PDAgfHwgYm9yZGVyIT0wIHx8IGxldmVsPDApIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBHTGVudW0gZm9ybWF0ID0gMDsKKyAgICBHTGVudW0gdHlwZSA9IEdMX1VOU0lHTkVEX0JZVEU7CisgICAgY29uc3QgR0dMU3VyZmFjZSYgY2JTdXJmYWNlID0gYy0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLmNvbG9yLnM7CisgICAgY29uc3QgaW50IGNiRm9ybWF0SWR4ID0gY2JTdXJmYWNlLmZvcm1hdDsKKyAgICBzd2l0Y2ggKGNiRm9ybWF0SWR4KSB7CisgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQl81NjU6CisgICAgICAgIHR5cGUgPSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQkFfNTU1MToKKyAgICAgICAgdHlwZSA9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQ6CisgICAgICAgIHR5cGUgPSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgc3dpdGNoIChpbnRlcm5hbGZvcm1hdCkgeworICAgIGNhc2UgR0xfQUxQSEE6CisgICAgY2FzZSBHTF9MVU1JTkFOQ0VfQUxQSEE6CisgICAgY2FzZSBHTF9MVU1JTkFOQ0U6CisgICAgICAgIHR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOworICAgICAgICBicmVhazsgICAgCisgICAgfQorCisgICAgLy8gZmlndXJlIG91dCB0aGUgZm9ybWF0IHRvIHVzZSBmb3IgdGhlIG5ldyB0ZXh0dXJlCisgICAgc3dpdGNoIChjYkZvcm1hdElkeCkgeworICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6CisgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX0FfODoKKyAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxOgorICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQ6CisgICAgICAgIGZvcm1hdCA9IGludGVybmFsZm9ybWF0OworICAgICAgICBicmVhazsgICAgCisgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQlhfODg4ODoKKyAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzg4ODoKKyAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NToKKyAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfTF84OgorICAgICAgICBzd2l0Y2ggKGludGVybmFsZm9ybWF0KSB7CisgICAgICAgIGNhc2UgR0xfTFVNSU5BTkNFOgorICAgICAgICBjYXNlIEdMX1JHQjoKKyAgICAgICAgICAgIGZvcm1hdCA9IGludGVybmFsZm9ybWF0OworICAgICAgICAgICAgYnJlYWs7ICAgIAorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChmb3JtYXQgPT0gMCkgeworICAgICAgICAvLyBpbnZhbGlkIGNvbWJpbmF0aW9uCisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgdGhlIG5ldyB0ZXh0dXJlLi4uCisgICAgaW50MzJfdCBzaXplOworICAgIEdHTFN1cmZhY2UqIHN1cmZhY2U7CisgICAgaW50IGVycm9yID0gY3JlYXRlVGV4dHVyZVN1cmZhY2UoYywgJnN1cmZhY2UsICZzaXplLAorICAgICAgICAgICAgbGV2ZWwsIGZvcm1hdCwgdHlwZSwgd2lkdGgsIGhlaWdodCk7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIGVycm9yKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvLyBUaGUgYm90dG9tIHJvdyBpcyBzdG9yZWQgZmlyc3QgaW4gdGV4dHVyZXMKKyAgICBHR0xTdXJmYWNlIHR4U3VyZmFjZSgqc3VyZmFjZSk7CisgICAgdHhTdXJmYWNlLnN0cmlkZSA9IC10eFN1cmZhY2Uuc3RyaWRlOworCisgICAgLy8gKHgseSkgaXMgdGhlIGxvd2VyLWxlZnQgY29ybmVyIG9mIGNvbG9yQnVmZmVyCisgICAgeSA9IGNiU3VyZmFjZS5oZWlnaHQgLSAoeSArIGhlaWdodCk7CisKKyAgICBpbnQgZXJyID0gY29weVBpeGVscyhjLAorICAgICAgICAgICAgdHhTdXJmYWNlLCAwLCAwLAorICAgICAgICAgICAgY2JTdXJmYWNlLCB4LCB5LCBjYlN1cmZhY2Uud2lkdGgsIGNiU3VyZmFjZS5oZWlnaHQpOyAgCisgICAgaWYgKGVycikgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBlcnIpOworICAgIH0KKworICAgIGdlbmVyYXRlTWlwbWFwKGMsIGxldmVsKTsKK30KKwordm9pZCBnbENvcHlUZXhTdWJJbWFnZTJEKAorICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwKKyAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCit7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBpZiAodGFyZ2V0ICE9IEdMX1RFWFRVUkVfMkQpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoeG9mZnNldDwwIHx8IHlvZmZzZXQ8MCB8fCB3aWR0aDwwIHx8IGhlaWdodDwwIHx8IGxldmVsPDApIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSB7CisgICAgICAgIHJldHVybjsgLy8gb2theSwgYnV0IG5vLW9wLgorICAgIH0KKworICAgIC8vIGZpbmQgb3V0IHdoaWNoIHRleHR1cmUgaXMgYm91bmQgdG8gdGhlIGN1cnJlbnQgdW5pdAorICAgIGNvbnN0IGludCBhY3RpdmUgPSBjLT50ZXh0dXJlcy5hY3RpdmU7CisgICAgRUdMVGV4dHVyZU9iamVjdCogdGV4ID0gYy0+dGV4dHVyZXMudG11W2FjdGl2ZV0udGV4dHVyZTsKKyAgICBjb25zdCBHR0xTdXJmYWNlJiBzdXJmYWNlKHRleC0+bWlwKGxldmVsKSk7CisKKyAgICBpZiAoIXRleC0+aW50ZXJuYWxmb3JtYXQpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICgoeG9mZnNldCArIHdpZHRoICA+IEdMc2l6ZWkoc3VyZmFjZS53aWR0aCkpIHx8CisgICAgICAgICh5b2Zmc2V0ICsgaGVpZ2h0ID4gR0xzaXplaShzdXJmYWNlLmhlaWdodCkpKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVGhlIGJvdHRvbSByb3cgaXMgc3RvcmVkIGZpcnN0IGluIHRleHR1cmVzCisgICAgR0dMU3VyZmFjZSB0eFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgdHhTdXJmYWNlLnN0cmlkZSA9IC10eFN1cmZhY2Uuc3RyaWRlOworCisgICAgLy8gKHgseSkgaXMgdGhlIGxvd2VyLWxlZnQgY29ybmVyIG9mIGNvbG9yQnVmZmVyCisgICAgY29uc3QgR0dMU3VyZmFjZSYgY2JTdXJmYWNlID0gYy0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLmNvbG9yLnM7CisgICAgeSA9IGNiU3VyZmFjZS5oZWlnaHQgLSAoeSArIGhlaWdodCk7CisKKyAgICBpbnQgZXJyID0gY29weVBpeGVscyhjLAorICAgICAgICAgICAgc3VyZmFjZSwgeG9mZnNldCwgeW9mZnNldCwKKyAgICAgICAgICAgIGNiU3VyZmFjZSwgeCwgeSwgd2lkdGgsIGhlaWdodCk7ICAKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnZW5lcmF0ZU1pcG1hcChjLCBsZXZlbCk7Cit9CisKK3ZvaWQgZ2xSZWFkUGl4ZWxzKAorICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgaWYgKChmb3JtYXQgIT0gR0xfUkdCQSkgJiYgKGZvcm1hdCAhPSBHTF9SR0IpKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCh0eXBlICE9IEdMX1VOU0lHTkVEX0JZVEUpICYmICh0eXBlICE9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81KSkgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh3aWR0aDwwIHx8IGhlaWdodDwwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh4PDAgfHwgeDwwKSB7CisgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBmb3JtYXRJZHggPSBHR0xfUElYRUxfRk9STUFUX05PTkU7CisgICAgaWYgKChmb3JtYXQgPT0gR0xfUkdCQSkgJiYgKHR5cGUgPT0gR0xfVU5TSUdORURfQllURSkpIHsKKyAgICAgICAgZm9ybWF0SWR4ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7CisgICAgfSBlbHNlIGlmICgoZm9ybWF0ID09IEdMX1JHQikgJiYgKHR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUpKSB7CisgICAgICAgIGZvcm1hdElkeCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTsKKyAgICB9IGVsc2UgeworICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBHR0xTdXJmYWNlJiByZWFkU3VyZmFjZSA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5yZWFkLnM7CisgICAgaWYgKCh4K3dpZHRoID4gR0xpbnQocmVhZFN1cmZhY2Uud2lkdGgpKSB8fAorICAgICAgICAgICAgKHkraGVpZ2h0ID4gR0xpbnQocmVhZFN1cmZhY2UuaGVpZ2h0KSkpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBHR0xGb3JtYXQmIHBpeGVsRm9ybWF0KGMtPnJhc3Rlcml6ZXIuZm9ybWF0c1tmb3JtYXRJZHhdKTsKKyAgICBjb25zdCBpbnQzMl90IGFsaWduID0gYy0+dGV4dHVyZXMucGFja0FsaWdubWVudC0xOworICAgIGNvbnN0IGludDMyX3QgYnByID0gKCh3aWR0aCAqIHBpeGVsRm9ybWF0LnNpemUpICsgYWxpZ24pICYgfmFsaWduOworICAgIGNvbnN0IGludDMyX3Qgc3RyaWRlID0gYnByIC8gcGl4ZWxGb3JtYXQuc2l6ZTsKKworICAgIEdHTFN1cmZhY2UgdXNlclN1cmZhY2U7CisgICAgdXNlclN1cmZhY2UudmVyc2lvbiA9IHNpemVvZih1c2VyU3VyZmFjZSk7CisgICAgdXNlclN1cmZhY2Uud2lkdGggID0gd2lkdGg7CisgICAgdXNlclN1cmZhY2UuaGVpZ2h0ID0gaGVpZ2h0OworICAgIHVzZXJTdXJmYWNlLnN0cmlkZSA9IC1zdHJpZGU7IC8vIGJvdHRvbSByb3cgaXMgdHJhbnNmZXJlZCBmaXJzdAorICAgIHVzZXJTdXJmYWNlLmZvcm1hdCA9IGZvcm1hdElkeDsKKyAgICB1c2VyU3VyZmFjZS5jb21wcmVzc2VkRm9ybWF0ID0gMDsKKyAgICB1c2VyU3VyZmFjZS5kYXRhID0gKEdMdWJ5dGUqKXBpeGVsczsKKworICAgIC8vIHVzZSBwaXhlbC1mbGluZ2VyIHRvIGhhbmRsZSBhbGwgdGhlIGNvbnZlcnNpb25zCisgICAgR0dMQ29udGV4dCogZ2dsID0gZ2V0UmFzdGVyaXplcihjKTsKKyAgICBpZiAoIWdnbCkgeworICAgICAgICAvLyB0aGUgb25seSByZWFzb24gdGhpcyB3b3VsZCBmYWlsIGlzIGJlY2F1c2Ugd2UgcmFuIG91dCBvZiBtZW1vcnkKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfT1VUX09GX01FTU9SWSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnZ2wtPmNvbG9yQnVmZmVyKGdnbCwgJnVzZXJTdXJmYWNlKTsgIC8vIGRlc3RpbmF0aW9uIGlzIHVzZXIgYnVmZmVyIAorICAgIGdnbC0+YmluZFRleHR1cmUoZ2dsLCAmcmVhZFN1cmZhY2UpOyAgLy8gc291cmNlIGlzIHJlYWQtYnVmZmVyCisgICAgZ2dsLT50ZXhDb29yZDJpKGdnbCwgeCwgcmVhZFN1cmZhY2UuaGVpZ2h0IC0gKHkgKyBoZWlnaHQpKTsKKyAgICBnZ2wtPnJlY3RpKGdnbCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAwCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIERyYXdUZXh0dXJlIEV4dGVuc2lvbgorI2VuZGlmCisKK3ZvaWQgZ2xEcmF3VGV4c3ZPRVMoY29uc3QgR0xzaG9ydCogY29vcmRzKSB7CisgICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKKyAgICBkcmF3VGV4aU9FUyhjb29yZHNbMF0sIGNvb3Jkc1sxXSwgY29vcmRzWzJdLCBjb29yZHNbM10sIGNvb3Jkc1s0XSwgYyk7Cit9Cit2b2lkIGdsRHJhd1RleGl2T0VTKGNvbnN0IEdMaW50KiBjb29yZHMpIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGRyYXdUZXhpT0VTKGNvb3Jkc1swXSwgY29vcmRzWzFdLCBjb29yZHNbMl0sIGNvb3Jkc1szXSwgY29vcmRzWzRdLCBjKTsKK30KK3ZvaWQgZ2xEcmF3VGV4c09FUyhHTHNob3J0IHggLCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3LCBHTHNob3J0IGgpIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGRyYXdUZXhpT0VTKHgsIHksIHosIHcsIGgsIGMpOworfQordm9pZCBnbERyYXdUZXhpT0VTKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcsIEdMaW50IGgpIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGRyYXdUZXhpT0VTKHgsIHksIHosIHcsIGgsIGMpOworfQorCit2b2lkIGdsRHJhd1RleGZ2T0VTKGNvbnN0IEdMZmxvYXQqIGNvb3JkcykgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgZHJhd1RleHhPRVMoCisgICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoY29vcmRzWzBdKSwKKyAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChjb29yZHNbMV0pLAorICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGNvb3Jkc1syXSksCisgICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoY29vcmRzWzNdKSwKKyAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChjb29yZHNbNF0pLAorICAgICAgICAgICAgYyk7Cit9Cit2b2lkIGdsRHJhd1RleHh2T0VTKGNvbnN0IEdMZml4ZWQqIGNvb3JkcykgeworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgZHJhd1RleHhPRVMoY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSwgY29vcmRzWzNdLCBjb29yZHNbNF0sIGMpOworfQordm9pZCBnbERyYXdUZXhmT0VTKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdywgR0xmbG9hdCBoKXsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGRyYXdUZXh4T0VTKAorICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKHgpLCBnZ2xGbG9hdFRvRml4ZWQoeSksIGdnbEZsb2F0VG9GaXhlZCh6KSwKKyAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZCh3KSwgZ2dsRmxvYXRUb0ZpeGVkKGgpLAorICAgICAgICAgICAgYyk7Cit9Cit2b2lkIGdsRHJhd1RleHhPRVMoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiwgR0xmaXhlZCB3LCBHTGZpeGVkIGgpIHsKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGRyYXdUZXh4T0VTKHgsIHksIHosIHcsIGgsIGMpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC90ZXh0dXJlLmggYi9vcGVuZ2wvbGliYWdsL3RleHR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzU3OTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYmFnbC90ZXh0dXJlLmgKQEAgLTAsMCArMSw0NSBAQAorLyogbGlicy9vcGVuZ2xlcy90ZXh0dXJlLmgKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfVEVYVFVSRV9ICisjZGVmaW5lIEFORFJPSURfT1BFTkdMRVNfVEVYVFVSRV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHByaXZhdGUvcGl4ZWxmbGluZ2VyL2dnbF9jb250ZXh0Lmg+CisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKyNpbmNsdWRlICJjb250ZXh0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBvZ2xlc19pbml0X3RleHR1cmUob2dsZXNfY29udGV4dF90KiBjKTsKK3ZvaWQgb2dsZXNfdW5pbml0X3RleHR1cmUob2dsZXNfY29udGV4dF90KiBjKTsKK3ZvaWQgb2dsZXNfdmFsaWRhdGVfdGV4dHVyZV9pbXBsKG9nbGVzX2NvbnRleHRfdCogYyk7CisKK2lubGluZSB2b2lkIG9nbGVzX3ZhbGlkYXRlX3RleHR1cmUob2dsZXNfY29udGV4dF90KiBjKSB7CisgICAgaWYgKGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykKKyAgICAgICAgb2dsZXNfdmFsaWRhdGVfdGV4dHVyZV9pbXBsKGMpOworfQorCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX1RFWFRVUkVfSApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC92ZXJ0ZXguY3BwIGIvb3BlbmdsL2xpYmFnbC92ZXJ0ZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDA0ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL3ZlcnRleC5jcHAKQEAgLTAsMCArMSwyNDcgQEAKKy8qIGxpYnMvb3BlbmdsZXMvdmVydGV4LmNwcAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImNvbnRleHQuaCIKKyNpbmNsdWRlICJmcC5oIgorI2luY2x1ZGUgInZlcnRleC5oIgorI2luY2x1ZGUgInN0YXRlLmgiCisjaW5jbHVkZSAibWF0cml4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIG9nbGVzX2luaXRfdmVydGV4KG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBjLT5jdWxsLmVuYWJsZSA9IEdMX0ZBTFNFOworICAgIGMtPmN1bGwuY3VsbEZhY2UgPSBHTF9CQUNLOworICAgIGMtPmN1bGwuZnJvbnRGYWNlID0gR0xfQ0NXOworCisgICAgYy0+Y3VycmVudC5jb2xvci5yID0gMHgxMDAwMDsKKyAgICBjLT5jdXJyZW50LmNvbG9yLmcgPSAweDEwMDAwOworICAgIGMtPmN1cnJlbnQuY29sb3IuYiA9IDB4MTAwMDA7CisgICAgYy0+Y3VycmVudC5jb2xvci5hID0gMHgxMDAwMDsKKworICAgIGMtPmN1cnJlbnROb3JtYWwueiA9IDB4MTAwMDA7Cit9CisKK3ZvaWQgb2dsZXNfdW5pbml0X3ZlcnRleChvZ2xlc19jb250ZXh0X3QqIGMpCit7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHZlcnRleCBwcm9jZXNzaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIERpdmlkZXMgYSB2ZXJ0ZXggY2xpcCBjb29yZGluYXRlcyBieSBXCitzdGF0aWMgaW5saW5lCit2b2lkIHBlcnNwZWN0aXZlKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYsIHVpbnQzMl90IGVuYWJsZXMpCit7CisgICAgLy8gW3gseSx6XXdpbmRvdyA9IHZwdCAqIChbeCx5LHpdY2xpcCAvIGNsaXAudykKKyAgICAvLyBbd113aW5kb3cgPSAxL3cKKworICAgIC8vIFdpdGggYSByZWd1bGFyIHByb2plY3Rpb24gZ2VuZXJhdGVkIGJ5IGdsRnJ1c3R1bSgpLAorICAgIC8vIHdlIGhhdmUgdz0teiwgdGhlcmVmb3JlLCB3IGlzIGluIFt6TmVhciwgekZhcl0uCisgICAgLy8gQWxzbywgek5lYXIgYW5kIHpGYXIgYXJlIHN0cmljbHkgcG9zaXRpdmUsCisgICAgLy8gYW5kIDEvdyAod2luZG93LncpIGlzIGluIFsxL3pGYXIsIDEvek5lYXJdLCB1c3VhbGx5IHRoaXMKKyAgICAvLyBtZWFucyBdMCwgK2luZlsgLS0gaG93ZXZlciwgaXQgaXMgYWx3YXlzIHJlY29tbWVuZGVkCisgICAgLy8gdG8gdXNlIGFzIGxhcmdlIHZhbHVlcyBhcyBwb3NzaWJsZSBmb3Igek5lYXIuCisgICAgLy8gQWxsIGluIGFsbCwgdyBpcyB1c3VhbGx5IHNtYWxsZXIgdGhhbiAxLjAgKGFzc3VtaW5nCisgICAgLy8gek5lYXIgaXMgYXQgbGVhc3QgMS4wKTsgYW5kIGV2ZW4gaWYgek5lYXIgaXMgc21hbGxlciB0aGFuIDEuMAorICAgIC8vIHZhbHVlcyBvZiB3IHdvbid0IGJlIHRvbyBiaWcuCisKKyAgICBjb25zdCBpbnQzMl90IHJ3ID0gZ2dsUmVjaXAyOCh2LT5jbGlwLncpOworICAgIGNvbnN0IEdMZml4ZWQqIGNvbnN0IG0gPSBjLT50cmFuc2Zvcm1zLnZwdC50cmFuc2Zvcm0ubWF0cml4Lm07CisgICAgdi0+d2luZG93LncgPSBydzsKKyAgICB2LT53aW5kb3cueCA9IGdnbE11bEFkZHgoZ2dsTXVseCh2LT5jbGlwLngsIHJ3LCAxNiksIG1bIDBdLCBtWzEyXSwgMjgpOyAKKyAgICB2LT53aW5kb3cueSA9IGdnbE11bEFkZHgoZ2dsTXVseCh2LT5jbGlwLnksIHJ3LCAxNiksIG1bIDVdLCBtWzEzXSwgMjgpOworICAgIHYtPndpbmRvdy54ID0gVFJJX0ZST01fRklYRUQodi0+d2luZG93LngpOworICAgIHYtPndpbmRvdy55ID0gVFJJX0ZST01fRklYRUQodi0+d2luZG93LnkpOworICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9ERVBUSF9URVNUKSB7CisgICAgICAgIHYtPndpbmRvdy56ID0gZ2dsTXVsQWRkeChnZ2xNdWx4KHYtPmNsaXAueiwgcncsIDE2KSwgbVsxMF0sIG1bMTRdLCAyOCk7CisgICAgfQorfQorCisvLyBmcnVzdHVtIGNsaXBwaW5nIGFuZCBXLWRpdmlkZQorc3RhdGljIGlubGluZQordm9pZCBjbGlwRnJ1c3R1bVBlcnNwZWN0aXZlKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYsIHVpbnQzMl90IGVuYWJsZXMpCit7CisgICAgLy8gbmRjID0gY2xpcCAvIFcKKyAgICAvLyB3aW5kb3cgPSBuY2QgKiB2aWV3cG9ydAorICAgIAorICAgIC8vIGNsaXAgdG8gdGhlIHZpZXctdm9sdW1lCisgICAgdWludDMyX3QgY2xpcCA9IHYtPmZsYWdzICYgdmVydGV4X3Q6OkNMSVBfQUxMOworICAgIGNvbnN0IEdMZml4ZWQgdyA9IHYtPmNsaXAudzsKKyAgICBpZiAodi0+Y2xpcC54IDwgLXcpICAgY2xpcCB8PSB2ZXJ0ZXhfdDo6Q0xJUF9MOworICAgIGlmICh2LT5jbGlwLnggPiAgdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX1I7CisgICAgaWYgKHYtPmNsaXAueSA8IC13KSAgIGNsaXAgfD0gdmVydGV4X3Q6OkNMSVBfQjsKKyAgICBpZiAodi0+Y2xpcC55ID4gIHcpICAgY2xpcCB8PSB2ZXJ0ZXhfdDo6Q0xJUF9UOworICAgIGlmICh2LT5jbGlwLnogPCAtdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX047CisgICAgaWYgKHYtPmNsaXAueiA+ICB3KSAgIGNsaXAgfD0gdmVydGV4X3Q6OkNMSVBfRjsKKworICAgIHYtPmZsYWdzIHw9IGNsaXA7CisgICAgYy0+YXJyYXlzLmN1bGwgJj0gY2xpcDsKKworICAgIGlmIChnZ2xfbGlrZWx5KCFjbGlwKSkgeworICAgICAgICAvLyBpZiB0aGUgdmVydGV4IGlzIGNsaXBwZWQsIHdlIGRvbid0IGRvIHRoZSBwZXJzcGVjdGl2ZQorICAgICAgICAvLyBkaXZpZGUsIHNpbmNlIHdlIGRvbid0IG5lZWQgaXRzIHdpbmRvdyBjb29yZGluYXRlcy4KKyAgICAgICAgcGVyc3BlY3RpdmUoYywgdiwgZW5hYmxlcyk7CisgICAgfQorfQorCisvLyBmcnVzdHVtIGNsaXBwaW5nLCB1c2VyIGNsaXBwaW5nIGFuZCBXLWRpdmlkZQorc3RhdGljIGlubGluZQordm9pZCBjbGlwQWxsUGVyc3BlY3RpdmUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdiwgdWludDMyX3QgZW5hYmxlcykKK3sKKyAgICAvLyBjb21wdXRlIGV5ZSBjb29yZGluYXRlcworICAgIGMtPmFycmF5cy5tdl90cmFuc2Zvcm0oCisgICAgICAgICAgICAmYy0+dHJhbnNmb3Jtcy5tb2RlbHZpZXcudHJhbnNmb3JtLCAmdi0+ZXllLCAmdi0+b2JqKTsKKyAgICB2LT5mbGFncyB8PSB2ZXJ0ZXhfdDo6RVlFOworCisgICAgLy8gY2xpcCB0aGlzIHZlcnRleCBhZ2FpbnN0IGVhY2ggdXNlciBjbGlwIHBsYW5lCisgICAgdWludDMyX3QgY2xpcCA9IDA7CisgICAgaW50IHBsYW5lcyA9IGMtPmNsaXBQbGFuZXMuZW5hYmxlOworICAgIHdoaWxlIChwbGFuZXMpIHsKKyAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIGdnbENseihwbGFuZXMpOworICAgICAgICBwbGFuZXMgJj0gfigxPDxpKTsKKyAgICAgICAgLy8gWFhYOiB3ZSBzaG91bGQgaGF2ZSBhIHNwZWNpYWwgZG90KCkgZm9yIDIsMyw0IGNvb3JkcyB2ZXJ0aWNlcworICAgICAgICBHTGZpeGVkIGQgPSBkb3Q0KGMtPmNsaXBQbGFuZXMucGxhbmVbaV0uZXF1YXRpb24udiwgdi0+ZXllLnYpOworICAgICAgICBpZiAoZCA8IDApIHsKKyAgICAgICAgICAgIGNsaXAgfD0gMHgxMDA8PGk7CisgICAgICAgIH0KKyAgICB9CisgICAgdi0+ZmxhZ3MgfD0gY2xpcDsKKworICAgIGNsaXBGcnVzdHVtUGVyc3BlY3RpdmUoYywgdiwgZW5hYmxlcyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBvZ2xlc192ZXJ0ZXhfcHJvamVjdChvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KSB7CisgICAgcGVyc3BlY3RpdmUoYywgdiwgYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVzKTsKK30KKwordm9pZCBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUyRChvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KQoreworICAgIC8vIGhlcmUgd2UgYXNzdW1lIHc9MS4wIGFuZCB0aGUgdmlld3BvcnQgdHJhbnNmb3JtYXRpb24KKyAgICAvLyBoYXMgYmVlbiBhcHBsaWVkIGFscmVhZHkuCisgICAgYy0+YXJyYXlzLmN1bGwgPSAwOworICAgIHYtPndpbmRvdy54ID0gVFJJX0ZST01fRklYRUQodi0+Y2xpcC54KTsKKyAgICB2LT53aW5kb3cueSA9IFRSSV9GUk9NX0ZJWEVEKHYtPmNsaXAueSk7CisgICAgdi0+d2luZG93LnogPSB2LT5jbGlwLno7CisgICAgdi0+d2luZG93LncgPSB2LT5jbGlwLncgPDwgMTI7Cit9CisKK3ZvaWQgb2dsZXNfdmVydGV4X3BlcnNwZWN0aXZlM0RaKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpIHsKKyAgICBjbGlwRnJ1c3R1bVBlcnNwZWN0aXZlKGMsIHYsIEdHTF9FTkFCTEVfREVQVEhfVEVTVCk7Cit9Cit2b2lkIG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTNEKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpIHsKKyAgICBjbGlwRnJ1c3R1bVBlcnNwZWN0aXZlKGMsIHYsIDApOworfQordm9pZCBvZ2xlc192ZXJ0ZXhfY2xpcEFsbFBlcnNwZWN0aXZlM0RaKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpIHsKKyAgICBjbGlwQWxsUGVyc3BlY3RpdmUoYywgdiwgR0dMX0VOQUJMRV9ERVBUSF9URVNUKTsKK30KK3ZvaWQgb2dsZXNfdmVydGV4X2NsaXBBbGxQZXJzcGVjdGl2ZTNEKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpIHsKKyAgICBjbGlwQWxsUGVyc3BlY3RpdmUoYywgdiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGNsaXBQbGFuZXgoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkKiBlcXUsIG9nbGVzX2NvbnRleHRfdCogYykKK3sKKyAgICBjb25zdCBpbnQgcCA9IHBsYW5lIC0gR0xfQ0xJUF9QTEFORTA7CisgICAgaWYgKGdnbF91bmxpa2VseSh1aW50MzJfdChwKSA+IChHTF9DTElQX1BMQU5FNSAtIEdMX0NMSVBfUExBTkUwKSkpIHsKKyAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZlYzRfdCYgZXF1YXRpb24gPSBjLT5jbGlwUGxhbmVzLnBsYW5lW3BdLmVxdWF0aW9uOworICAgIG1lbWNweShlcXVhdGlvbi52LCBlcXUsIHNpemVvZih2ZWM0X3QpKTsKKworICAgIG9nbGVzX3ZhbGlkYXRlX3RyYW5zZm9ybShjLCB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZJVCk7CisgICAgdHJhbnNmb3JtX3QmIG12aXQgPSBjLT50cmFuc2Zvcm1zLm12aXQ0OworICAgIG12aXQucG9pbnQ0KCZtdml0LCAmZXF1YXRpb24sICZlcXVhdGlvbik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisKK3ZvaWQgZ2xDb2xvcjRmKEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgYSkKK3sKKyAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOworICAgIGMtPmN1cnJlbnQuY29sb3IuciAgICAgICA9IGdnbEZsb2F0VG9GaXhlZChyKTsKKyAgICBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLnIgPSBnZ2xDbGFtcHgoYy0+Y3VycmVudC5jb2xvci5yKTsKKyAgICBjLT5jdXJyZW50LmNvbG9yLmcgICAgICAgPSBnZ2xGbG9hdFRvRml4ZWQoZyk7CisgICAgYy0+Y3VycmVudENvbG9yQ2xhbXBlZC5nID0gZ2dsQ2xhbXB4KGMtPmN1cnJlbnQuY29sb3IuZyk7CisgICAgYy0+Y3VycmVudC5jb2xvci5iICAgICAgID0gZ2dsRmxvYXRUb0ZpeGVkKGIpOworICAgIGMtPmN1cnJlbnRDb2xvckNsYW1wZWQuYiA9IGdnbENsYW1weChjLT5jdXJyZW50LmNvbG9yLmIpOworICAgIGMtPmN1cnJlbnQuY29sb3IuYSAgICAgICA9IGdnbEZsb2F0VG9GaXhlZChhKTsKKyAgICBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLmEgPSBnZ2xDbGFtcHgoYy0+Y3VycmVudC5jb2xvci5hKTsKK30KKwordm9pZCBnbENvbG9yNHgoR0xmaXhlZCByLCBHTGZpeGVkIGcsIEdMZml4ZWQgYiwgR0xmaXhlZCBhKQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+Y3VycmVudC5jb2xvci5yID0gcjsKKyAgICBjLT5jdXJyZW50LmNvbG9yLmcgPSBnOworICAgIGMtPmN1cnJlbnQuY29sb3IuYiA9IGI7CisgICAgYy0+Y3VycmVudC5jb2xvci5hID0gYTsKKyAgICBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLnIgPSBnZ2xDbGFtcHgocik7CisgICAgYy0+Y3VycmVudENvbG9yQ2xhbXBlZC5nID0gZ2dsQ2xhbXB4KGcpOworICAgIGMtPmN1cnJlbnRDb2xvckNsYW1wZWQuYiA9IGdnbENsYW1weChiKTsKKyAgICBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLmEgPSBnZ2xDbGFtcHgoYSk7Cit9CisKK3ZvaWQgZ2xOb3JtYWwzZihHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+Y3VycmVudE5vcm1hbC54ID0gZ2dsRmxvYXRUb0ZpeGVkKHgpOworICAgIGMtPmN1cnJlbnROb3JtYWwueSA9IGdnbEZsb2F0VG9GaXhlZCh5KTsKKyAgICBjLT5jdXJyZW50Tm9ybWFsLnogPSBnZ2xGbG9hdFRvRml4ZWQoeik7Cit9CisKK3ZvaWQgZ2xOb3JtYWwzeChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgYy0+Y3VycmVudE5vcm1hbC54ID0geDsKKyAgICBjLT5jdXJyZW50Tm9ybWFsLnkgPSB5OworICAgIGMtPmN1cnJlbnROb3JtYWwueiA9IHo7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBnbENsaXBQbGFuZWYoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0KiBlcXUpCit7CisgICAgY29uc3QgR0xmaXhlZCBlcXV4WzRdID0geworICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGVxdVswXSksCisgICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoZXF1WzFdKSwKKyAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChlcXVbMl0pLAorICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGVxdVszXSkKKyAgICB9OworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgY2xpcFBsYW5leChwbGFuZSwgZXF1eCwgYyk7Cit9CisKK3ZvaWQgZ2xDbGlwUGxhbmV4KEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCogZXF1KQoreworICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7CisgICAgY2xpcFBsYW5leChwbGFuZSwgZXF1LCBjKTsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvdmVydGV4LmggYi9vcGVuZ2wvbGliYWdsL3ZlcnRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZTYyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGliYWdsL3ZlcnRleC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIGxpYnMvb3BlbmdsZXMvdmVydGV4LmgKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfVkVSVEVYX0gKKyNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19WRVJURVhfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGdsIHsKK3N0cnVjdCB2ZXJ0ZXhfdDsKK3N0cnVjdCBvZ2xlc19jb250ZXh0X3Q7Cit9OworCit2b2lkIG9nbGVzX2luaXRfdmVydGV4KG9nbGVzX2NvbnRleHRfdCogYyk7Cit2b2lkIG9nbGVzX3VuaW5pdF92ZXJ0ZXgob2dsZXNfY29udGV4dF90KiBjKTsKKwordm9pZCBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUyRChvZ2xlc19jb250ZXh0X3QqLCB2ZXJ0ZXhfdCopOworCit2b2lkIG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTNEKG9nbGVzX2NvbnRleHRfdCosIHZlcnRleF90Kik7Cit2b2lkIG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTNEWihvZ2xlc19jb250ZXh0X3QqLCB2ZXJ0ZXhfdCopOwordm9pZCBvZ2xlc192ZXJ0ZXhfY2xpcEFsbFBlcnNwZWN0aXZlM0Qob2dsZXNfY29udGV4dF90KiwgdmVydGV4X3QqKTsKK3ZvaWQgb2dsZXNfdmVydGV4X2NsaXBBbGxQZXJzcGVjdGl2ZTNEWihvZ2xlc19jb250ZXh0X3QqLCB2ZXJ0ZXhfdCopOworCisKK3ZvaWQgb2dsZXNfdmVydGV4X3Byb2plY3Qob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCopOworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9PUEVOR0xFU19WRVJURVhfSAorCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9BbmRyb2lkLm1rIGIvb3BlbmdsL2xpYnMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWNjNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYnMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDUzIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIworIyBCdWlsZCBNRVRBIEVHTCBsaWJyYXJ5CisjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAJXAorCUVHTC9lZ2wuY3BwIAkJXAorCUVHTC9ncHUuY3BwCQkJXAorIworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmN1dGlscyBsaWJ1dGlscyBsaWJ1aQorTE9DQUxfTERMSUJTIDo9IC1scHRocmVhZCAtbGRsCitMT0NBTF9NT0RVTEU6PSBsaWJFR0wKKworIyBuZWVkZWQgb24gc2ltIGJ1aWxkIGJlY2F1c2Ugb2Ygd2VpcmQgbG9nZ2luZyBpc3N1ZXMKK2lmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKK2Vsc2UKKyAgICBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCisgICAgIyB3ZSBuZWVkIHRvIGFjY2VzcyB0aGUgQmlvbmljIHByaXZhdGUgaGVhZGVyIDxiaW9uaWNfdGxzLmg+CisgICAgTE9DQUxfQ0ZMQUdTICs9IC1JJChMT0NBTF9QQVRIKS8uLi8uLi8uLi8uLi9iaW9uaWMvbGliYy9wcml2YXRlCitlbmRpZgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKworCisjCisjIEJ1aWxkIHRoZSB3cmFwcGVyIE9wZW5HTCBFUyBsaWJyYXJ5CisjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAJXAorCUdMRVNfQ00vZ2wuY3BwLmFybSAJCVwKKwlHTEVTX0NNL2dsX2xvZ2dlci5jcHAgCVwKKyMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjdXRpbHMgbGlidXRpbHMgbGlidWkgbGliRUdMCitMT0NBTF9MRExJQlMgOj0gLWxwdGhyZWFkIC1sZGwKK0xPQ0FMX01PRFVMRTo9IGxpYkdMRVN2MV9DTQorCisjIG5lZWRlZCBvbiBzaW0gYnVpbGQgYmVjYXVzZSBvZiB3ZWlyZCBsb2dnaW5nIGlzc3VlcworaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorZWxzZQorICAgIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKKyAgICAjIHdlIG5lZWQgdG8gYWNjZXNzIHRoZSBCaW9uaWMgcHJpdmF0ZSBoZWFkZXIgPGJpb25pY190bHMuaD4KKyAgICBMT0NBTF9DRkxBR1MgKz0gLUkkKExPQ0FMX1BBVEgpLy4uLy4uLy4uLy4uL2Jpb25pYy9saWJjL3ByaXZhdGUKK2VuZGlmCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwIGIvb3BlbmdsL2xpYnMvRUdML2VnbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3YzhiYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwCkBAIC0wLDAgKzEsMTM2MyBAQAorLyogCisgKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqKgorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKioKKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiR0xMb2dnZXIiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaWYgSEFWRV9BTkRST0lEX09TCisjaW5jbHVkZSA8bGludXgvYW5kcm9pZF9wbWVtLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+CisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbWVtb3J5Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJob29rcy5oIgorI2luY2x1ZGUgImVnbF9pbXBsLmgiCisKKworI2RlZmluZSBNQUtFX0NPTkZJRyhfaW1wbCwgX2luZGV4KSAgKChFR0xDb25maWcpKCgoX2ltcGwpPDwyNCkgfCAoX2luZGV4KSkpCisjZGVmaW5lIHNldEVycm9yKF9lLCBfcikgc2V0RXJyb3JFdGMoX19GVU5DVElPTl9fLCBfX0xJTkVfXywgX2UsIF9yKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgVkVSU0lPTl9NQUpPUiAxCisjZGVmaW5lIFZFUlNJT05fTUlOT1IgNAorc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnVmVuZG9yU3RyaW5nICAgICA9ICJBbmRyb2lkIjsKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ1ZlcnNpb25TdHJpbmcgICAgPSAiMS4zMSBBbmRyb2lkIE1FVEEtRUdMIjsKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ0NsaWVudEFwaVN0cmluZyAgPSAiT3BlbkdMIEVTIjsKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ0V4dGVuc2lvblN0cmluZyAgPSAiIjsKKwordGVtcGxhdGUgPGludCBNQUdJQz4KK3N0cnVjdCBlZ2xfb2JqZWN0X3QKK3sKKyAgICBlZ2xfb2JqZWN0X3QoKSA6IG1hZ2ljKE1BR0lDKSB7IH0KKyAgICB+ZWdsX29iamVjdF90KCkgeyBtYWdpYyA9IDA7IH0KKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtYWdpYyA9PSBNQUdJQzsgfQorcHJpdmF0ZToKKyAgICB1aW50MzJfdCAgICBtYWdpYzsKK307CisKK3N0cnVjdCBlZ2xfZGlzcGxheV90IDogcHVibGljIGVnbF9vYmplY3RfdDwnX2RweSc+Cit7CisgICAgRUdMRGlzcGxheSAgZHB5c1syXTsKKyAgICBFR0xDb25maWcqICBjb25maWdzWzJdOworICAgIEVHTGludCAgICAgIG51bUNvbmZpZ3NbMl07CisgICAgRUdMaW50ICAgICAgbnVtVG90YWxDb25maWdzOworICAgIGNoYXIgY29uc3QqIGV4dGVuc2lvbnNTdHJpbmc7CisgICAgdm9sYXRpbGUgaW50MzJfdCByZWZzOworICAgIHN0cnVjdCBzdHJpbmdzX3QgeworICAgICAgICBjaGFyIGNvbnN0ICogdmVuZG9yOworICAgICAgICBjaGFyIGNvbnN0ICogdmVyc2lvbjsKKyAgICAgICAgY2hhciBjb25zdCAqIGNsaWVudEFwaTsKKyAgICAgICAgY2hhciBjb25zdCAqIGV4dGVuc2lvbnM7CisgICAgfTsKKyAgICBzdHJpbmdzX3QgICBxdWVyeVN0cmluZ1syXTsKK307CisKK3N0cnVjdCBlZ2xfc3VyZmFjZV90IDogcHVibGljIGVnbF9vYmplY3RfdDwnX3NyZic+Cit7CisgICAgZWdsX3N1cmZhY2VfdChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLAorICAgICAgICAgICAgTmF0aXZlV2luZG93VHlwZSB3aW5kb3csIGludCBpbXBsLCBlZ2xfY29ubmVjdGlvbl90IGNvbnN0KiBjbngpIAorICAgIDogZHB5KGRweSksIHN1cmZhY2Uoc3VyZmFjZSksIHdpbmRvdyh3aW5kb3cpLCBpbXBsKGltcGwpLCBjbngoY254KQorICAgIHsKKyAgICAgICAgLy8gTk9URTogd2luZG93IG11c3QgYmUgaW5jUmVmJ2VkIGFuZCBjb25uZWN0ZWQgYWxyZWFkeQorICAgIH0KKyAgICB+ZWdsX3N1cmZhY2VfdCgpIHsKKyAgICAgICAgaWYgKHdpbmRvdykgeworICAgICAgICAgICAgaWYgKHdpbmRvdy0+ZGlzY29ubmVjdCkKKyAgICAgICAgICAgICAgICB3aW5kb3ctPmRpc2Nvbm5lY3Qod2luZG93KTsKKyAgICAgICAgICAgIHdpbmRvdy0+ZGVjUmVmKHdpbmRvdyk7CisgICAgICAgIH0KKyAgICB9CisgICAgRUdMRGlzcGxheSAgICAgICAgICAgICAgICAgIGRweTsKKyAgICBFR0xTdXJmYWNlICAgICAgICAgICAgICAgICAgc3VyZmFjZTsKKyAgICBOYXRpdmVXaW5kb3dUeXBlICAgICAgICAgICAgd2luZG93OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsOworICAgIGVnbF9jb25uZWN0aW9uX3QgY29uc3QqICAgICBjbng7Cit9OworCitzdHJ1Y3QgZWdsX2NvbnRleHRfdCA6IHB1YmxpYyBlZ2xfb2JqZWN0X3Q8J19jdHgnPgoreworICAgIGVnbF9jb250ZXh0X3QoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIGludCBpbXBsLCBlZ2xfY29ubmVjdGlvbl90IGNvbnN0KiBjbngpIAorICAgIDogZHB5KGRweSksIGNvbnRleHQoY29udGV4dCksIHJlYWQoMCksIGRyYXcoMCksIGltcGwoaW1wbCksIGNueChjbngpCisgICAgeworICAgIH0KKyAgICBFR0xEaXNwbGF5ICAgICAgICAgICAgICAgICAgZHB5OworICAgIEVHTENvbnRleHQgICAgICAgICAgICAgICAgICBjb250ZXh0OworICAgIEVHTFN1cmZhY2UgICAgICAgICAgICAgICAgICByZWFkOworICAgIEVHTFN1cmZhY2UgICAgICAgICAgICAgICAgICBkcmF3OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsOworICAgIGVnbF9jb25uZWN0aW9uX3QgY29uc3QqICAgICBjbng7Cit9OworCitzdHJ1Y3QgdGxzX3QKK3sKKyAgICB0bHNfdCgpIDogZXJyb3IoRUdMX1NVQ0NFU1MpLCBjdHgoMCkgeyB9CisgICAgRUdMaW50ICAgICAgZXJyb3I7CisgICAgRUdMQ29udGV4dCAgY3R4OworfTsKKworc3RhdGljIHZvaWQgZ2xfdW5pbXBsZW1lbnRlZCgpIHsKKyAgICBMT0dFKCJjYWxsZWQgdW5pbXBsZW1lbnRlZCBPcGVuR0wgRVMgQVBJIik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEdMIC8gRUdMIGhvb2tzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyN1bmRlZiBHTF9FTlRSWQorI3VuZGVmIEVHTF9FTlRSWQorI2RlZmluZSBHTF9FTlRSWShfciwgX2FwaSwgLi4uKSAjX2FwaSwKKyNkZWZpbmUgRUdMX0VOVFJZKF9yLCBfYXBpLCAuLi4pICNfYXBpLAorCitzdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGdsX25hbWVzW10gPSB7CisgICAgI2luY2x1ZGUgImdsX2VudHJpZXMuaW4iCisgICAgTlVMTAorfTsKKworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBlZ2xfbmFtZXNbXSA9IHsKKyAgICAjaW5jbHVkZSAiZWdsX2VudHJpZXMuaW4iCisgICAgTlVMTAorfTsKKworI3VuZGVmIEdMX0VOVFJZCisjdW5kZWYgRUdMX0VOVFJZCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZWdsX2Nvbm5lY3Rpb25fdCBnRUdMSW1wbFsyXTsKK3N0YXRpYyBlZ2xfZGlzcGxheV90IGdEaXNwbGF5W05VTV9ESVNQTEFZU107CitzdGF0aWMgcHRocmVhZF9tdXRleF90IGdUaHJlYWRMb2NhbFN0b3JhZ2VLZXlNdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CitzdGF0aWMgcHRocmVhZF9rZXlfdCBnRUdMVGhyZWFkTG9jYWxTdG9yYWdlS2V5ID0gLTE7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZ2xfaG9va3NfdCBnSG9va3NbSU1QTF9OVU1fSU1QTEVNRU5UQVRJT05TXTsKK3B0aHJlYWRfa2V5X3QgZ0dMV3JhcHBlcktleSA9IC0xOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCitjb25zdCBjaGFyICplZ2xfc3RyZXJyb3IoRUdMaW50IGVycikKK3sKKyAgICBzd2l0Y2ggKGVycil7CisgICAgICAgIGNhc2UgRUdMX1NVQ0NFU1M6ICAgICAgICAgICAgICAgcmV0dXJuICJFR0xfU1VDQ0VTUyI7CisgICAgICAgIGNhc2UgRUdMX05PVF9JTklUSUFMSVpFRDogICAgICAgcmV0dXJuICJFR0xfTk9UX0lOSVRJQUxJWkVEIjsKKyAgICAgICAgY2FzZSBFR0xfQkFEX0FDQ0VTUzogICAgICAgICAgICByZXR1cm4gIkVHTF9CQURfQUNDRVNTIjsKKyAgICAgICAgY2FzZSBFR0xfQkFEX0FMTE9DOiAgICAgICAgICAgICByZXR1cm4gIkVHTF9CQURfQUxMT0MiOworICAgICAgICBjYXNlIEVHTF9CQURfQVRUUklCVVRFOiAgICAgICAgIHJldHVybiAiRUdMX0JBRF9BVFRSSUJVVEUiOworICAgICAgICBjYXNlIEVHTF9CQURfQ09ORklHOiAgICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9DT05GSUciOworICAgICAgICBjYXNlIEVHTF9CQURfQ09OVEVYVDogICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9DT05URVhUIjsKKyAgICAgICAgY2FzZSBFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRTogICByZXR1cm4gIkVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFIjsKKyAgICAgICAgY2FzZSBFR0xfQkFEX0RJU1BMQVk6ICAgICAgICAgICByZXR1cm4gIkVHTF9CQURfRElTUExBWSI7CisgICAgICAgIGNhc2UgRUdMX0JBRF9NQVRDSDogICAgICAgICAgICAgcmV0dXJuICJFR0xfQkFEX01BVENIIjsKKyAgICAgICAgY2FzZSBFR0xfQkFEX05BVElWRV9QSVhNQVA6ICAgICByZXR1cm4gIkVHTF9CQURfTkFUSVZFX1BJWE1BUCI7CisgICAgICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfV0lORE9XOiAgICAgcmV0dXJuICJFR0xfQkFEX05BVElWRV9XSU5ET1ciOworICAgICAgICBjYXNlIEVHTF9CQURfUEFSQU1FVEVSOiAgICAgICAgIHJldHVybiAiRUdMX0JBRF9QQVJBTUVURVIiOworICAgICAgICBjYXNlIEVHTF9CQURfU1VSRkFDRTogICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9TVVJGQUNFIjsKKyAgICAgICAgY2FzZSBFR0xfQ09OVEVYVF9MT1NUOiAgICAgICAgICByZXR1cm4gIkVHTF9DT05URVhUX0xPU1QiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gIlVOS05PV04iOworICAgIH0KK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK3ZvaWQgY2xlYXJUTFMoKSB7CisgICAgaWYgKGdFR0xUaHJlYWRMb2NhbFN0b3JhZ2VLZXkgIT0gLTEpIHsKKyAgICAgICAgdGxzX3QqIHRscyA9ICh0bHNfdCopcHRocmVhZF9nZXRzcGVjaWZpYyhnRUdMVGhyZWFkTG9jYWxTdG9yYWdlS2V5KTsKKyAgICAgICAgaWYgKHRscykgeworICAgICAgICAgICAgZGVsZXRlIHRsczsKKyAgICAgICAgICAgIHB0aHJlYWRfc2V0c3BlY2lmaWMoZ0VHTFRocmVhZExvY2FsU3RvcmFnZUtleSwgMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB0bHNfdCogZ2V0VExTKCkKK3sKKyAgICB0bHNfdCogdGxzID0gKHRsc190KilwdGhyZWFkX2dldHNwZWNpZmljKGdFR0xUaHJlYWRMb2NhbFN0b3JhZ2VLZXkpOworICAgIGlmICh0bHMgPT0gMCkgeworICAgICAgICB0bHMgPSBuZXcgdGxzX3Q7CisgICAgICAgIHB0aHJlYWRfc2V0c3BlY2lmaWMoZ0VHTFRocmVhZExvY2FsU3RvcmFnZUtleSwgdGxzKTsKKyAgICB9CisgICAgcmV0dXJuIHRsczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCitUIHNldEVycm9yRXRjKGNvbnN0IGNoYXIqIGNhbGxlciwgaW50IGxpbmUsIEVHTGludCBlcnJvciwgVCByZXR1cm5WYWx1ZSkgeworICAgIGlmIChnRUdMVGhyZWFkTG9jYWxTdG9yYWdlS2V5ID09IC0xKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ1RocmVhZExvY2FsU3RvcmFnZUtleU11dGV4KTsKKyAgICAgICAgaWYgKGdFR0xUaHJlYWRMb2NhbFN0b3JhZ2VLZXkgPT0gLTEpCisgICAgICAgICAgICBwdGhyZWFkX2tleV9jcmVhdGUoJmdFR0xUaHJlYWRMb2NhbFN0b3JhZ2VLZXksIE5VTEwpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ1RocmVhZExvY2FsU3RvcmFnZUtleU11dGV4KTsKKyAgICB9CisgICAgdGxzX3QqIHRscyA9IGdldFRMUygpOworICAgIGlmICh0bHMtPmVycm9yICE9IGVycm9yKSB7CisgICAgICAgIExPR0UoIiVzOiVkIGVycm9yICV4ICglcykiLCBjYWxsZXIsIGxpbmUsIGVycm9yLCBlZ2xfc3RyZXJyb3IoZXJyb3IpKTsKKyAgICAgICAgdGxzLT5lcnJvciA9IGVycm9yOworICAgIH0KKyAgICByZXR1cm4gcmV0dXJuVmFsdWU7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCitHTGludCBnZXRFcnJvcigpIHsKKyAgICBpZiAoZ0VHTFRocmVhZExvY2FsU3RvcmFnZUtleSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIEVHTF9TVUNDRVNTOworICAgIHRsc190KiB0bHMgPSAodGxzX3QqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoZ0VHTFRocmVhZExvY2FsU3RvcmFnZUtleSk7CisgICAgaWYgKCF0bHMpIHJldHVybiBFR0xfU1VDQ0VTUzsKKyAgICBHTGludCBlcnJvciA9IHRscy0+ZXJyb3I7CisgICAgdGxzLT5lcnJvciA9IEVHTF9TVUNDRVNTOworICAgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK3ZvaWQgc2V0Q29udGV4dChFR0xDb250ZXh0IGN0eCkgeworICAgIGlmIChnRUdMVGhyZWFkTG9jYWxTdG9yYWdlS2V5ID09IC0xKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ1RocmVhZExvY2FsU3RvcmFnZUtleU11dGV4KTsKKyAgICAgICAgaWYgKGdFR0xUaHJlYWRMb2NhbFN0b3JhZ2VLZXkgPT0gLTEpCisgICAgICAgICAgICBwdGhyZWFkX2tleV9jcmVhdGUoJmdFR0xUaHJlYWRMb2NhbFN0b3JhZ2VLZXksIE5VTEwpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ1RocmVhZExvY2FsU3RvcmFnZUtleU11dGV4KTsKKyAgICB9CisgICAgdGxzX3QqIHRscyA9IGdldFRMUygpOworICAgIHRscy0+Y3R4ID0gY3R4OworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQorRUdMQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgIGlmIChnRUdMVGhyZWFkTG9jYWxTdG9yYWdlS2V5ID09IC0xKQorICAgICAgICByZXR1cm4gRUdMX05PX0NPTlRFWFQ7CisgICAgdGxzX3QqIHRscyA9ICh0bHNfdCopcHRocmVhZF9nZXRzcGVjaWZpYyhnRUdMVGhyZWFkTG9jYWxTdG9yYWdlS2V5KTsKKyAgICBpZiAoIXRscykgcmV0dXJuIEVHTF9OT19DT05URVhUOworICAgIHJldHVybiB0bHMtPmN0eDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NsYXNzIElTdXJmYWNlQ29tcG9zZXI7Citjb25zdCBzcDxJU3VyZmFjZUNvbXBvc2VyPiYgZ2V0U3VyZmFjZUZsaW5nZXIoKTsKK3JlcXVlc3RfZ3B1X3QqIGdwdV9hY3F1aXJlKHZvaWQqIHVzZXIpOworaW50IGdwdV9yZWxlYXNlKHZvaWQqLCByZXF1ZXN0X2dwdV90KiBncHUpOworCitzdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQordm9pZCAqbG9hZF9kcml2ZXIoY29uc3QgY2hhciogZHJpdmVyLCBnbF9ob29rc190KiBob29rcykKK3sKKyAgICB2b2lkKiBkc28gPSBkbG9wZW4oZHJpdmVyLCBSVExEX05PVyB8IFJUTERfTE9DQUwpOworICAgIExPR0VfSUYoIWRzbywKKyAgICAgICAgICAgICJjb3VsZG4ndCBsb2FkIDwlcz4gbGlicmFyeSAoJXMpIiwKKyAgICAgICAgICAgIGRyaXZlciwgZGxlcnJvcigpKTsKKworICAgIGlmIChkc28pIHsKKyAgICAgICAgdm9pZCoqIGN1cnI7CisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCAqIGFwaTsKKyAgICAgICAgZ2xfaG9va3NfdDo6Z2xfdCogZ2wgPSAmaG9va3MtPmdsOworICAgICAgICBjdXJyID0gKHZvaWQqKilnbDsKKyAgICAgICAgYXBpID0gZ2xfbmFtZXM7CisgICAgICAgIHdoaWxlICgqYXBpKSB7CisgICAgICAgICAgICB2b2lkKiBmID0gZGxzeW0oZHNvLCAqYXBpKTsKKyAgICAgICAgICAgIC8vTE9HRCgiPCVzPiBAIDB4JXAiLCAqYXBpLCBmKTsKKyAgICAgICAgICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvL0xPR1coIjwlcz4gbm90IGZvdW5kIGluICVzIiwgKmFwaSwgZHJpdmVyKTsKKyAgICAgICAgICAgICAgICBmID0gKHZvaWQqKWdsX3VuaW1wbGVtZW50ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqY3VycisrID0gZjsKKyAgICAgICAgICAgIGFwaSsrOworICAgICAgICB9CisgICAgICAgIGdsX2hvb2tzX3Q6OmVnbF90KiBlZ2wgPSAmaG9va3MtPmVnbDsKKyAgICAgICAgY3VyciA9ICh2b2lkKiopZWdsOworICAgICAgICBhcGkgPSBlZ2xfbmFtZXM7CisgICAgICAgIHdoaWxlICgqYXBpKSB7CisgICAgICAgICAgICB2b2lkKiBmID0gZGxzeW0oZHNvLCAqYXBpKTsKKyAgICAgICAgICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvL0xPR1coIjwlcz4gbm90IGZvdW5kIGluICVzIiwgKmFwaSwgZHJpdmVyKTsKKyAgICAgICAgICAgICAgICBmID0gKHZvaWQqKTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqY3VycisrID0gZjsKKyAgICAgICAgICAgIGFwaSsrOworICAgICAgICB9CisKKyAgICAgICAgLy8gaG9vayB0aGlzIGRyaXZlciB1cCB3aXRoIHN1cmZhY2VmbGluZ2VyIGlmIG5lZWRlZAorICAgICAgICByZWdpc3Rlcl9ncHVfdCByZWdpc3Rlcl9ncHUgPSAKKyAgICAgICAgICAgIChyZWdpc3Rlcl9ncHVfdClkbHN5bShkc28sICJvZW1fcmVnaXN0ZXJfZ3B1Iik7CisKKyAgICAgICAgaWYgKHJlZ2lzdGVyX2dwdSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoZ2V0U3VyZmFjZUZsaW5nZXIoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJfZ3B1KGRzbywgZ3B1X2FjcXVpcmUsIGdwdV9yZWxlYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZHNvOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKK2ludCBiaW5hcnlTZWFyY2goCisgICAgICAgIFQgY29uc3Qgc29ydGVkQXJyYXlbXSwgaW50IGZpcnN0LCBpbnQgbGFzdCwgVCBrZXkpCit7CisgICAgd2hpbGUgKGZpcnN0IDw9IGxhc3QpIHsKKyAgICAgICAgaW50IG1pZCA9IChmaXJzdCArIGxhc3QpIC8gMjsKKyAgICAgICAgaWYgKGtleSA+IHNvcnRlZEFycmF5W21pZF0pIHsgCisgICAgICAgICAgICBmaXJzdCA9IG1pZCArIDE7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5IDwgc29ydGVkQXJyYXlbbWlkXSkgeyAKKyAgICAgICAgICAgIGxhc3QgPSBtaWQgLSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG1pZDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBFR0xpbnQgY29uZmlnVG9VbmlxdWVJZChlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCwgaW50IGksIGludCBpbmRleCkgCit7CisgICAgLy8gTk9URTogdGhpcyBtYXBwaW5nIHdvcmtzIG9ubHkgaWYgd2UgaGF2ZSBubyBtb3JlIHRoYW4gdHdvIEVHTGltcGwKKyAgICByZXR1cm4gKGk+MCA/IGRwLT5udW1Db25maWdzWzBdIDogMCkgKyBpbmRleDsKK30KKworc3RhdGljIHZvaWQgdW5pcXVlSWRUb0NvbmZpZyhlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCwgRUdMaW50IGNvbmZpZ0lkLAorICAgICAgICBpbnQmIGksIGludCYgaW5kZXgpIAoreworICAgIC8vIE5PVEU6IHRoaXMgbWFwcGluZyB3b3JrcyBvbmx5IGlmIHdlIGhhdmUgbm8gbW9yZSB0aGFuIHR3byBFR0xpbXBsCisgICAgc2l6ZV90IG51bUNvbmZpZ3MgPSBkcC0+bnVtQ29uZmlnc1swXTsKKyAgICBpID0gY29uZmlnSWQgLyBudW1Db25maWdzOworICAgIGluZGV4ID0gY29uZmlnSWQgJSBudW1Db25maWdzOworfQorCitzdGF0aWMgaW50IGNtcF9jb25maWdzKGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgRUdMQ29uZmlnIGMwID0gKihFR0xDb25maWcgY29uc3QgKilhOworICAgIEVHTENvbmZpZyBjMSA9ICooRUdMQ29uZmlnIGNvbnN0ICopYjsKKyAgICByZXR1cm4gYzA8YzEgPyAtMSA6IChjMD5jMSA/IDEgOiAwKTsKK30KKworc3RydWN0IGV4dGVudGlvbl9tYXBfdCB7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIGFkZHJlc3M7Cit9OworCitzdGF0aWMgY29uc3QgZXh0ZW50aW9uX21hcF90IGdFeHRlbnRpb25NYXBbXSA9IHsKK307CisKK3N0YXRpYyBleHRlbnRpb25fbWFwX3QgZ0dMRXh0ZW50aW9uTWFwW01BWF9OVU1CRVJfT0ZfR0xfRVhURU5TSU9OU107CisKK3N0YXRpYyB2b2lkKCpmaW5kUHJvY0FkZHJlc3MoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgY29uc3QgZXh0ZW50aW9uX21hcF90KiBtYXAsIHNpemVfdCBuKSkoKSAKK3sKKyAgICBmb3IgKHVpbnQzMl90IGk9MCA7IGk8biA7IGkrKykgeworICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCBtYXBbaV0ubmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXBbaV0uYWRkcmVzczsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IGdsX2NvbnRleHRfbG9zdCgpIHsKKyAgICBzZXRHbFRocmVhZFNwZWNpZmljKCZnSG9va3NbSU1QTF9DT05URVhUX0xPU1RdKTsKKyAgICByZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgZWdsX2NvbnRleHRfbG9zdCgpIHsKKyAgICBzZXRHbFRocmVhZFNwZWNpZmljKCZnSG9va3NbSU1QTF9DT05URVhUX0xPU1RdKTsKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorc3RhdGljIEVHTEJvb2xlYW4gZWdsX2NvbnRleHRfbG9zdF9zd2FwX2J1ZmZlcnModm9pZCosIHZvaWQqKSB7CisgICAgdXNsZWVwKDEwMDAwMCk7IC8vIGRvbid0IHVzZSBhbGwgdGhlIENQVQorICAgIHNldEdsVGhyZWFkU3BlY2lmaWMoJmdIb29rc1tJTVBMX0NPTlRFWFRfTE9TVF0pOworICAgIHJldHVybiBFR0xfRkFMU0U7Cit9CitzdGF0aWMgR0xpbnQgZWdsX2NvbnRleHRfbG9zdF9nZXRfZXJyb3IoKSB7CisgICAgcmV0dXJuIEVHTF9DT05URVhUX0xPU1Q7Cit9CitzdGF0aWMgaW50IGV4dF9jb250ZXh0X2xvc3QoKSB7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdsX25vX2NvbnRleHQoKSB7CisgICAgTE9HRSgiY2FsbCB0byBPcGVuR0wgRVMgQVBJIHdpdGggbm8gY3VycmVudCBjb250ZXh0Iik7Cit9CitzdGF0aWMgdm9pZCBlYXJseV9lZ2xfaW5pdCh2b2lkKSAKK3sKKyNpZiAhVVNFX0ZBU1RfVExTX0tFWQorICAgIHB0aHJlYWRfa2V5X2NyZWF0ZSgmZ0dMV3JhcHBlcktleSwgTlVMTCk7CisjZW5kaWYKKyAgICB1aW50MzJfdCBhZGRyID0gKHVpbnQzMl90KSgodm9pZCopZ2xfbm9fY29udGV4dCk7CisgICAgYW5kcm9pZF9tZW1zZXQzMigKKyAgICAgICAgICAgICh1aW50MzJfdCopKHZvaWQqKSZnSG9va3NbSU1QTF9OT19DT05URVhUXSwgCisgICAgICAgICAgICBhZGRyLCAKKyAgICAgICAgICAgIHNpemVvZihnSG9va3NbSU1QTF9OT19DT05URVhUXSkpOworICAgIHNldEdsVGhyZWFkU3BlY2lmaWMoJmdIb29rc1tJTVBMX05PX0NPTlRFWFRdKTsKK30KKworc3RhdGljIHB0aHJlYWRfb25jZV90IG9uY2VfY29udHJvbCA9IFBUSFJFQURfT05DRV9JTklUOworc3RhdGljIGludCBzRWFybHlJbml0U3RhdGUgPSBwdGhyZWFkX29uY2UoJm9uY2VfY29udHJvbCwgJmVhcmx5X2VnbF9pbml0KTsKKworCitzdGF0aWMgaW5saW5lCitlZ2xfZGlzcGxheV90KiBnZXRfZGlzcGxheShFR0xEaXNwbGF5IGRweSkKK3sKKyAgICB1aW50cHRyX3QgaW5kZXggPSB1aW50cHRyX3QoZHB5KS0xVTsKKyAgICByZXR1cm4gKGluZGV4ID49IE5VTV9ESVNQTEFZUykgPyBOVUxMIDogJmdEaXNwbGF5W2luZGV4XTsKK30KKworc3RhdGljIGlubGluZQorZWdsX3N1cmZhY2VfdCogZ2V0X3N1cmZhY2UoRUdMU3VyZmFjZSBzdXJmYWNlKQoreworICAgIGVnbF9zdXJmYWNlX3QqIHMgPSAoZWdsX3N1cmZhY2VfdCAqKXN1cmZhY2U7CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2VnbF9jb250ZXh0X3QqIGdldF9jb250ZXh0KEVHTENvbnRleHQgY29udGV4dCkKK3sKKyAgICBlZ2xfY29udGV4dF90KiBjID0gKGVnbF9jb250ZXh0X3QgKiljb250ZXh0OworICAgIHJldHVybiBjOworfQorCitzdGF0aWMgZWdsX2Nvbm5lY3Rpb25fdCogdmFsaWRhdGVfZGlzcGxheV9jb25maWcoCisgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICBlZ2xfZGlzcGxheV90IGNvbnN0KiYgZHAsIGludCYgaW1wbCwgaW50JiBpbmRleCkKK3sKKyAgICBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgaWYgKCFkcCkgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgKGVnbF9jb25uZWN0aW9uX3QqKU5VTEwpOworCisgICAgaW1wbCA9IHVpbnRwdHJfdChjb25maWcpPj4yNDsKKyAgICBpZiAodWludDMyX3QoaW1wbCkgPj0gMikgeworICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05GSUcsIChlZ2xfY29ubmVjdGlvbl90KilOVUxMKTsKKyAgICB9IAorICAgIGluZGV4ID0gdWludHB0cl90KGNvbmZpZykgJiAweEZGRkZGRjsKKyAgICBpZiAoaW5kZXggPj0gZHAtPm51bUNvbmZpZ3NbaW1wbF0pIHsKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09ORklHLCAoZWdsX2Nvbm5lY3Rpb25fdCopTlVMTCk7CisgICAgfQorICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbFtpbXBsXTsKKyAgICBpZiAoY254LT5kc28gPT0gMCkgeworICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05GSUcsIChlZ2xfY29ubmVjdGlvbl90KilOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuIGNueDsKK30KKworc3RhdGljIEVHTEJvb2xlYW4gdmFsaWRhdGVfZGlzcGxheV9jb250ZXh0KEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCkKK3sKKyAgICBpZiAoKHVpbnRwdHJfdChkcHkpLTFVKSA+PSBOVU1fRElTUExBWVMpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisgICAgaWYgKCFnZXRfZGlzcGxheShkcHkpLT5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisgICAgaWYgKCFjdHgpIC8vIFRPRE86IG1ha2Ugc3VyZSBjb250ZXh0IGlzIGEgdmFsaWQgb2JqZWN0CisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7CisgICAgaWYgKCFnZXRfY29udGV4dChjdHgpLT5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7CisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCitzdGF0aWMgRUdMQm9vbGVhbiB2YWxpZGF0ZV9kaXNwbGF5X3N1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSkKK3sKKyAgICBpZiAoKHVpbnRwdHJfdChkcHkpLTFVKSA+PSBOVU1fRElTUExBWVMpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisgICAgaWYgKCFnZXRfZGlzcGxheShkcHkpLT5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisgICAgaWYgKCFzdXJmYWNlKSAvLyBUT0RPOiBtYWtlIHN1cmUgc3VyZmFjZSBpcyBhIHZhbGlkIG9iamVjdAorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOworICAgIGlmICghZ2V0X3N1cmZhY2Uoc3VyZmFjZSktPmlzVmFsaWQoKSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKKyAgICByZXR1cm4gRUdMX1RSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitFR0xEaXNwbGF5IGVnbEdldERpc3BsYXkoTmF0aXZlRGlzcGxheVR5cGUgZGlzcGxheSkKK3sKKyAgICBpZiAoc0Vhcmx5SW5pdFN0YXRlKSB7CisgICAgICAgIHJldHVybiBFR0xfTk9fRElTUExBWTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBpbmRleCA9IHVpbnQzMl90KGRpc3BsYXkpOworICAgIGlmIChpbmRleCA+PSBOVU1fRElTUExBWVMpIHsKKyAgICAgICAgcmV0dXJuIEVHTF9OT19ESVNQTEFZOworICAgIH0KKyAgICAKKyAgICBFR0xEaXNwbGF5IGRweSA9IEVHTERpc3BsYXkodWludHB0cl90KGRpc3BsYXkpICsgMUxVKTsKKyAgICBlZ2xfZGlzcGxheV90KiBkID0gJmdEaXNwbGF5W2luZGV4XTsKKyAgICAgICAgCisgICAgLy8gZHluYW1pY2FsbHkgbG9hZCBhbGwgb3VyIEVHTCBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoYXQgZGlzcGxheQorICAgIC8vIGFuZCBjYWxsIGludG8gdGhlIHJlYWwgZWdsR2V0R2lzcGxheSgpCisgICAgZWdsX2Nvbm5lY3Rpb25fdCogY254ID0gJmdFR0xJbXBsW0lNUExfU09GVFdBUkVdOworICAgIGlmIChjbngtPmRzbyA9PSAwKSB7CisgICAgICAgIGNueC0+aG9va3MgPSAmZ0hvb2tzW0lNUExfU09GVFdBUkVdOworICAgICAgICBjbngtPmRzbyA9IGxvYWRfZHJpdmVyKCJsaWJhZ2wuc28iLCBjbngtPmhvb2tzKTsKKyAgICB9CisgICAgaWYgKGNueC0+ZHNvICYmIGQtPmRweXNbSU1QTF9TT0ZUV0FSRV09PUVHTF9OT19ESVNQTEFZKSB7CisgICAgICAgIGQtPmRweXNbSU1QTF9TT0ZUV0FSRV0gPSBjbngtPmhvb2tzLT5lZ2wuZWdsR2V0RGlzcGxheShkaXNwbGF5KTsKKyAgICAgICAgTE9HRV9JRihkLT5kcHlzW0lNUExfU09GVFdBUkVdPT1FR0xfTk9fRElTUExBWSwKKyAgICAgICAgICAgICAgICAiTm8gRUdMRGlzcGxheSBmb3Igc29mdHdhcmUgRUdMISIpOworICAgIH0KKworICAgIGNueCA9ICZnRUdMSW1wbFtJTVBMX0hBUkRXQVJFXTsKKyAgICBpZiAoY254LT5kc28gPT0gMCAmJiBjbngtPnVuYXZhaWxhYmxlID09IDApIHsKKyAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICBwcm9wZXJ0eV9nZXQoImRlYnVnLmVnbC5odyIsIHZhbHVlLCAiMSIpOworICAgICAgICBpZiAoYXRvaSh2YWx1ZSkgIT0gMCkgeworICAgICAgICAgICAgY254LT5ob29rcyA9ICZnSG9va3NbSU1QTF9IQVJEV0FSRV07CisgICAgICAgICAgICBjbngtPmRzbyA9IGxvYWRfZHJpdmVyKCJsaWJoZ2wuc28iLCBjbngtPmhvb2tzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0QoIjNEIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBkaXNhYmxlZCIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjbngtPmRzbyAmJiBkLT5kcHlzW0lNUExfSEFSRFdBUkVdPT1FR0xfTk9fRElTUExBWSkgeworICAgICAgICBhbmRyb2lkX21lbXNldDMyKAorICAgICAgICAgICAgICAgICh1aW50MzJfdCopKHZvaWQqKSZnSG9va3NbSU1QTF9DT05URVhUX0xPU1RdLmdsLAorICAgICAgICAgICAgICAgICh1aW50MzJfdCkoKHZvaWQqKWdsX2NvbnRleHRfbG9zdCksCisgICAgICAgICAgICAgICAgc2l6ZW9mKGdIb29rc1tJTVBMX0NPTlRFWFRfTE9TVF0uZ2wpKTsKKyAgICAgICAgYW5kcm9pZF9tZW1zZXQzMigKKyAgICAgICAgICAgICAgICAodWludDMyX3QqKSh2b2lkKikmZ0hvb2tzW0lNUExfQ09OVEVYVF9MT1NUXS5lZ2wsCisgICAgICAgICAgICAgICAgKHVpbnQzMl90KSgodm9pZCopZWdsX2NvbnRleHRfbG9zdCksCisgICAgICAgICAgICAgICAgc2l6ZW9mKGdIb29rc1tJTVBMX0NPTlRFWFRfTE9TVF0uZWdsKSk7CisgICAgICAgIGFuZHJvaWRfbWVtc2V0MzIoCisgICAgICAgICAgICAgICAgKHVpbnQzMl90Kikodm9pZCopJmdIb29rc1tJTVBMX0NPTlRFWFRfTE9TVF0uZXh0LAorICAgICAgICAgICAgICAgICh1aW50MzJfdCkoKHZvaWQqKWV4dF9jb250ZXh0X2xvc3QpLAorICAgICAgICAgICAgICAgIHNpemVvZihnSG9va3NbSU1QTF9DT05URVhUX0xPU1RdLmV4dCkpOworCisgICAgICAgIGdIb29rc1tJTVBMX0NPTlRFWFRfTE9TVF0uZWdsLmVnbFN3YXBCdWZmZXJzID0KKyAgICAgICAgICAgICAgICBlZ2xfY29udGV4dF9sb3N0X3N3YXBfYnVmZmVyczsKKyAgICAgICAgCisgICAgICAgIGdIb29rc1tJTVBMX0NPTlRFWFRfTE9TVF0uZWdsLmVnbEdldEVycm9yID0KKyAgICAgICAgICAgICAgICBlZ2xfY29udGV4dF9sb3N0X2dldF9lcnJvcjsKKworICAgICAgICBnSG9va3NbSU1QTF9DT05URVhUX0xPU1RdLmVnbC5lZ2xUZXJtaW5hdGUgPQorICAgICAgICAgICAgICAgIGdIb29rc1tJTVBMX0hBUkRXQVJFXS5lZ2wuZWdsVGVybWluYXRlOworICAgICAgICAKKyAgICAgICAgZC0+ZHB5c1tJTVBMX0hBUkRXQVJFXSA9IGNueC0+aG9va3MtPmVnbC5lZ2xHZXREaXNwbGF5KGRpc3BsYXkpOworICAgICAgICBpZiAoZC0+ZHB5c1tJTVBMX0hBUkRXQVJFXSA9PSBFR0xfTk9fRElTUExBWSkgeworICAgICAgICAgICAgTE9HRSgiaC93IGFjY2VsZXJhdGVkIGVnbEdldERpc3BsYXkoKSBmYWlsZWQgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgIGVnbF9zdHJlcnJvcihjbngtPmhvb2tzLT5lZ2wuZWdsR2V0RXJyb3IoKSkpOworICAgICAgICAgICAgZGxjbG9zZSgodm9pZCopY254LT5kc28pOworICAgICAgICAgICAgY254LT5kc28gPSAwOworICAgICAgICAgICAgLy8gaW4gY2FzZSBvZiBmYWlsdXJlLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB0cnkgYWdhaW4KKyAgICAgICAgICAgIC8vIGFzIGl0J3MgZXhwZW5zaXZlLgorICAgICAgICAgICAgY254LT51bmF2YWlsYWJsZSA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZHB5OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbml0aWFsaXphdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFR0xCb29sZWFuIGVnbEluaXRpYWxpemUoRUdMRGlzcGxheSBkcHksIEVHTGludCAqbWFqb3IsIEVHTGludCAqbWlub3IpCit7CisgICAgZWdsX2Rpc3BsYXlfdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBpZiAoIWRwKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworCisgICAgaWYgKGFuZHJvaWRfYXRvbWljX2luYygmZHAtPnJlZnMpID4gMCkgeworICAgICAgICBpZiAobWFqb3IgIT0gTlVMTCkgKm1ham9yID0gVkVSU0lPTl9NQUpPUjsKKyAgICAgICAgaWYgKG1pbm9yICE9IE5VTEwpICptaW5vciA9IFZFUlNJT05fTUlOT1I7CisgICAgICAgIHJldHVybiBFR0xfVFJVRTsKKyAgICB9CisgICAgCisgICAgc2V0R2xUaHJlYWRTcGVjaWZpYygmZ0hvb2tzW0lNUExfTk9fQ09OVEVYVF0pOworICAgIAorICAgIC8vIGluaXRpYWxpemUgZWFjaCBFR0wgYW5kCisgICAgLy8gYnVpbGQgb3VyIG93biBleHRlbnNpb24gc3RyaW5nIGZpcnN0LCBiYXNlZCBvbiB0aGUgZXh0ZW5zaW9uIHdlIGtub3cKKyAgICAvLyBhbmQgdGhlIGV4dGVuc2lvbiBzdXBwb3J0ZWQgYnkgb3VyIGNsaWVudCBpbXBsZW1lbnRhdGlvbgorICAgIGRwLT5leHRlbnNpb25zU3RyaW5nID0gc3RyZHVwKGdFeHRlbnNpb25TdHJpbmcpOworICAgIGZvciAoaW50IGk9MCA7IGk8MiA7IGkrKykgeworICAgICAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGxbaV07CisgICAgICAgIGNueC0+bWFqb3IgPSAtMTsKKyAgICAgICAgY254LT5taW5vciA9IC0xOworICAgICAgICBpZiAoIWNueC0+ZHNvKSAKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsSW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgJmNueC0+bWFqb3IsICZjbngtPm1pbm9yKSkgeworCisgICAgICAgICAgICAvL0xPR0QoImluaXRpYWxpemVkICVkIGRweT0lcCwgdmVyPSVkLiVkLCBjbng9JXAiLAorICAgICAgICAgICAgLy8gICAgICAgIGksIGRwLT5kcHlzW2ldLCBjbngtPm1ham9yLCBjbngtPm1pbm9yLCBjbngpOworCisgICAgICAgICAgICAvLyBnZXQgdGhlIHF1ZXJ5LXN0cmluZ3MgZm9yIHRoaXMgZGlzcGxheSBmb3IgZWFjaCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgZHAtPnF1ZXJ5U3RyaW5nW2ldLnZlbmRvciA9CisgICAgICAgICAgICAgICAgY254LT5ob29rcy0+ZWdsLmVnbFF1ZXJ5U3RyaW5nKGRwLT5kcHlzW2ldLCBFR0xfVkVORE9SKTsKKyAgICAgICAgICAgIGRwLT5xdWVyeVN0cmluZ1tpXS52ZXJzaW9uID0KKyAgICAgICAgICAgICAgICBjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlTdHJpbmcoZHAtPmRweXNbaV0sIEVHTF9WRVJTSU9OKTsKKyAgICAgICAgICAgIGRwLT5xdWVyeVN0cmluZ1tpXS5leHRlbnNpb25zID0gc3RyZHVwKAorICAgICAgICAgICAgICAgICAgICBjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlTdHJpbmcoZHAtPmRweXNbaV0sIEVHTF9FWFRFTlNJT05TKSk7CisgICAgICAgICAgICBkcC0+cXVlcnlTdHJpbmdbaV0uY2xpZW50QXBpID0KKyAgICAgICAgICAgICAgICBjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlTdHJpbmcoZHAtPmRweXNbaV0sIEVHTF9DTElFTlRfQVBJUyk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0QoIiVkOiBlZ2xJbml0aWFsaXplKCkgZmFpbGVkICglcykiLCAKKyAgICAgICAgICAgICAgICAgICAgaSwgZWdsX3N0cmVycm9yKGNueC0+aG9va3MtPmVnbC5lZ2xHZXRFcnJvcigpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBFR0xCb29sZWFuIHJlcyA9IEVHTF9GQUxTRTsKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOworICAgICAgICBpZiAoY254LT5kc28gJiYgY254LT5tYWpvcj49MCAmJiBjbngtPm1pbm9yPj0wKSB7CisgICAgICAgICAgICBFR0xpbnQgbjsKKyAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsR2V0Q29uZmlncyhkcC0+ZHB5c1tpXSwgMCwgMCwgJm4pKSB7CisgICAgICAgICAgICAgICAgZHAtPmNvbmZpZ3NbaV0gPSAoRUdMQ29uZmlnKiltYWxsb2Moc2l6ZW9mKEVHTENvbmZpZykqbik7CisgICAgICAgICAgICAgICAgaWYgKGRwLT5jb25maWdzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsR2V0Q29uZmlncygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgZHAtPmNvbmZpZ3NbaV0sIG4sICZkcC0+bnVtQ29uZmlnc1tpXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgdGhlIGNvbmZpZ3VyYXRpb25zIHNvIHdlIGNhbiBkbyBiaW5hcnkgc2VhcmNoZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHFzb3J0KCAgZHAtPmNvbmZpZ3NbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwLT5udW1Db25maWdzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRUdMQ29uZmlnKSwgY21wX2NvbmZpZ3MpOworCisgICAgICAgICAgICAgICAgICAgICAgICBkcC0+bnVtVG90YWxDb25maWdzICs9IG47CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBFR0xfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXMgPT0gRUdMX1RSVUUpIHsKKyAgICAgICAgaWYgKG1ham9yICE9IE5VTEwpICptYWpvciA9IFZFUlNJT05fTUFKT1I7CisgICAgICAgIGlmIChtaW5vciAhPSBOVUxMKSAqbWlub3IgPSBWRVJTSU9OX01JTk9SOworICAgICAgICByZXR1cm4gRUdMX1RSVUU7CisgICAgfQorICAgIHJldHVybiBzZXRFcnJvcihFR0xfTk9UX0lOSVRJQUxJWkVELCBFR0xfRkFMU0UpOworfQorCitFR0xCb29sZWFuIGVnbFRlcm1pbmF0ZShFR0xEaXNwbGF5IGRweSkKK3sKKyAgICBlZ2xfZGlzcGxheV90KiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgaWYgKCFkcCkgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKyAgICBpZiAoYW5kcm9pZF9hdG9taWNfZGVjKCZkcC0+cmVmcykgIT0gMSkKKyAgICAgICAgcmV0dXJuIEVHTF9UUlVFOworICAgICAgICAKKyAgICBFR0xCb29sZWFuIHJlcyA9IEVHTF9GQUxTRTsKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOworICAgICAgICBpZiAoY254LT5kc28pIHsKKyAgICAgICAgICAgIGNueC0+aG9va3MtPmVnbC5lZ2xUZXJtaW5hdGUoZHAtPmRweXNbaV0pOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBSRVZJU0lUOiBpdCdzIHVuY2xlYXIgd2hhdCB0byBkbyBpZiBlZ2xUZXJtaW5hdGUoKSBmYWlscywKKyAgICAgICAgICAgICAqIG9uIG9uZSBlbmQgd2Ugc2hvdWxkbid0IGNhcmUsIG9uIHRoZSBvdGhlciBlbmQgaWYgaXQgZmFpbHMKKyAgICAgICAgICAgICAqIGl0IG1pZ2h0IG5vdCBiZSBzYWZlIHRvIGNhbGwgZGxjbG9zZSgpICh0aGVyZSBjb3VsZCBiZSBzb21lCisgICAgICAgICAgICAgKiB0aHJlYWRzIGFyb3VuZCkuICovCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZyZWUoZHAtPmNvbmZpZ3NbaV0pOworICAgICAgICAgICAgZnJlZSgodm9pZCopZHAtPnF1ZXJ5U3RyaW5nW2ldLmV4dGVuc2lvbnMpOworICAgICAgICAgICAgZHAtPm51bUNvbmZpZ3NbaV0gPSAwOworICAgICAgICAgICAgZHAtPmRweXNbaV0gPSBFR0xfTk9fRElTUExBWTsKKyAgICAgICAgICAgIGRsY2xvc2UoKHZvaWQqKWNueC0+ZHNvKTsKKyAgICAgICAgICAgIGNueC0+ZHNvID0gMDsKKyAgICAgICAgICAgIHJlcyA9IEVHTF9UUlVFOworICAgICAgICB9CisgICAgfQorICAgIGZyZWUoKHZvaWQqKWRwLT5leHRlbnNpb25zU3RyaW5nKTsKKyAgICBkcC0+ZXh0ZW5zaW9uc1N0cmluZyA9IDA7CisgICAgZHAtPm51bVRvdGFsQ29uZmlncyA9IDA7CisgICAgY2xlYXJUTFMoKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25maWd1cmF0aW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VHTEJvb2xlYW4gZWdsR2V0Q29uZmlncyggICBFR0xEaXNwbGF5IGRweSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb25maWcgKmNvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQgKm51bV9jb25maWcpCit7CisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBpZiAoIWRwKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworCisgICAgR0xpbnQgbnVtQ29uZmlncyA9IGRwLT5udW1Ub3RhbENvbmZpZ3M7CisgICAgaWYgKCFjb25maWdzKSB7CisgICAgICAgICpudW1fY29uZmlnID0gbnVtQ29uZmlnczsKKyAgICAgICAgcmV0dXJuIEVHTF9UUlVFOworICAgIH0KKyAgICBHTGludCBuID0gMDsKKyAgICBmb3IgKGludCBqPTAgOyBqPDIgOyBqKyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wIDsgaTxkcC0+bnVtQ29uZmlnc1tqXSAmJiBjb25maWdfc2l6ZSA7IGkrKykgeworICAgICAgICAgICAgKmNvbmZpZ3MrKyA9IE1BS0VfQ09ORklHKGosIGkpOworICAgICAgICAgICAgY29uZmlnX3NpemUtLTsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorICAgIH0gICAgCisgICAgCisgICAgKm51bV9jb25maWcgPSBuOworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworRUdMQm9vbGVhbiBlZ2xDaG9vc2VDb25maWcoIEVHTERpc3BsYXkgZHB5LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTENvbmZpZyAqY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCAqbnVtX2NvbmZpZykKK3sKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOworICAgIGlmICghZHApIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisKKyAgICBpZiAoY29uZmlncyA9PSAwKSB7CisgICAgICAgICpudW1fY29uZmlnID0gMDsKKyAgICAgICAgcmV0dXJuIEVHTF9UUlVFOworICAgIH0KKworICAgIEVHTGludCBuOworICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX0ZBTFNFOworICAgICpudW1fY29uZmlnID0gMDsKKworICAgIAorICAgIC8vIEl0IGlzIHVuZm9ydHVuYXRlLCBidXQgd2UgbmVlZCB0byByZW1hcCB0aGUgRUdMX0NPTkZJR19JRHMsIAorICAgIC8vIHRvIGRvICB0aGlzLCB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggdGhlIGF0dHJpYl9saXN0IGFycmF5IG9uY2UKKyAgICAvLyB0byBmaWd1cmUgb3V0IGJvdGggaXRzIHNpemUgYW5kIGlmIGl0IGNvbnRhaW5zIGFuIEVHTF9DT05GSUdfSUQKKyAgICAvLyBrZXkuIElmIHNvLCB0aGUgZnVsbCBhcnJheSBpcyBjb3BpZWQgYW5kIHBhdGNoZWQuCisgICAgLy8gTk9URTogd2UgYXNzdW1lIHRoYXQgdGhlcmUgY2FuIGJlIG9ubHkgb25lIG9jY3VycmVuY2UKKyAgICAvLyBvZiBFR0xfQ09ORklHX0lELgorICAgIAorICAgIEVHTGludCBwYXRjaF9pbmRleCA9IC0xOworICAgIEdMaW50IGF0dHI7CisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIHdoaWxlICgoYXR0cj1hdHRyaWJfbGlzdFtzaXplXSkpIHsKKyAgICAgICAgaWYgKGF0dHIgPT0gRUdMX0NPTkZJR19JRCkKKyAgICAgICAgICAgIHBhdGNoX2luZGV4ID0gc2l6ZTsKKyAgICAgICAgc2l6ZSArPSAyOworICAgIH0KKyAgICBpZiAocGF0Y2hfaW5kZXggPj0gMCkgeworICAgICAgICBzaXplICs9IDI7IC8vIHdlIG5lZWQgY29weSB0aGUgc2VudGluZWwgYXMgd2VsbAorICAgICAgICBFR0xpbnQqIG5ld19saXN0ID0gKEVHTGludCopbWFsbG9jKHNpemUqc2l6ZW9mKEVHTGludCkpOworICAgICAgICBpZiAobmV3X2xpc3QgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfRkFMU0UpOworICAgICAgICBtZW1jcHkobmV3X2xpc3QsIGF0dHJpYl9saXN0LCBzaXplKnNpemVvZihFR0xpbnQpKTsKKworICAgICAgICAvLyBwYXRjaCB0aGUgcmVxdWVzdGVkIEVHTF9DT05GSUdfSUQKKyAgICAgICAgaW50IGksIGluZGV4OworICAgICAgICBFR0xpbnQmIGNvbmZpZ0lkKG5ld19saXN0W3BhdGNoX2luZGV4KzFdKTsKKyAgICAgICAgdW5pcXVlSWRUb0NvbmZpZyhkcCwgY29uZmlnSWQsIGksIGluZGV4KTsKKyAgICAgICAgCisgICAgICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbFtpXTsKKyAgICAgICAgaWYgKGNueC0+ZHNvKSB7CisgICAgICAgICAgICBjbngtPmhvb2tzLT5lZ2wuZWdsR2V0Q29uZmlnQXR0cmliKAorICAgICAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgZHAtPmNvbmZpZ3NbaV1baW5kZXhdLCAKKyAgICAgICAgICAgICAgICAgICAgRUdMX0NPTkZJR19JRCwgJmNvbmZpZ0lkKTsKKworICAgICAgICAgICAgLy8gYW5kIHN3aXRjaCB0byB0aGUgbmV3IGxpc3QKKyAgICAgICAgICAgIGF0dHJpYl9saXN0ID0gY29uc3RfY2FzdDxjb25zdCBFR0xpbnQgKj4obmV3X2xpc3QpOworCisgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgb25seSBjb25maWd1cmF0aW9uIHRoYXQgY2FuIG1hdGNoIGlzCisgICAgICAgICAgICAvLyBkcC0+Y29uZmlnc1tpXVtpbmRleF0sIGhvd2V2ZXIsIHdlIGRvbid0IGtub3cgaWYgaXQgd291bGQgYmUKKyAgICAgICAgICAgIC8vIHJlamVjdGVkIGJlY2F1c2Ugb2YgdGhlIG90aGVyIGF0dHJpYnV0ZXMsIHNvIHdlIGRvIGhhdmUgdG8gY2FsbAorICAgICAgICAgICAgLy8gY254LT5ob29rcy0+ZWdsLmVnbENob29zZUNvbmZpZygpIC0tIGJ1dCB3ZSBkb24ndCBoYXZlIHRvIGxvb3AKKyAgICAgICAgICAgIC8vIHRocm91Z2ggYWxsIHRoZSBFR0xpbXBsW10uCisgICAgICAgICAgICAvLyBXZSBhbHNvIGtub3cgd2UgY2FuIG9ubHkgZ2V0IGEgc2luZ2xlIGNvbmZpZyBiYWNrLCBhbmQgd2Uga25vdworICAgICAgICAgICAgLy8gd2hpY2ggb25lLgorCisgICAgICAgICAgICByZXMgPSBjbngtPmhvb2tzLT5lZ2wuZWdsQ2hvb3NlQ29uZmlnKAorICAgICAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgYXR0cmliX2xpc3QsIGNvbmZpZ3MsIGNvbmZpZ19zaXplLCAmbik7CisgICAgICAgICAgICBpZiAocmVzICYmIG4+MCkgeworICAgICAgICAgICAgICAgIC8vIG4gaGFzIHRvIGJlIDAgb3IgMSwgYnkgY29uc3RydWN0aW9uLCBhbmQgd2UgYWxyZWFkeSBrbm93CisgICAgICAgICAgICAgICAgLy8gd2hpY2ggY29uZmlnIGl0IHdpbGwgcmV0dXJuIChzaW5jZSB0aGVyZSBjYW4gYmUgb25seSBvbmUpLgorICAgICAgICAgICAgICAgIGNvbmZpZ3NbMF0gPSBNQUtFX0NPTkZJRyhpLCBpbmRleCk7CisgICAgICAgICAgICAgICAgKm51bV9jb25maWcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZnJlZShjb25zdF9jYXN0PEVHTGludCAqPihhdHRyaWJfbGlzdCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGZvciAoaW50IGk9MCA7IGk8MiA7IGkrKykgeworICAgICAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGxbaV07CisgICAgICAgIGlmIChjbngtPmRzbykgeworICAgICAgICAgICAgaWYgKGNueC0+aG9va3MtPmVnbC5lZ2xDaG9vc2VDb25maWcoCisgICAgICAgICAgICAgICAgICAgIGRwLT5kcHlzW2ldLCBhdHRyaWJfbGlzdCwgY29uZmlncywgY29uZmlnX3NpemUsICZuKSkgeworICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlc2UgY2xpZW50IEVHTENvbmZpZyB0byBvdXIKKyAgICAgICAgICAgICAgICAvLyBpbnRlcm5hbCBFR0xDb25maWcgZm9ybWF0LiBUaGlzIGlzIGRvbmUgaW4gTyhuIGxvZyBuKS4KKyAgICAgICAgICAgICAgICBmb3IgKGludCBqPTAgOyBqPG4gOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gYmluYXJ5U2VhcmNoPEVHTENvbmZpZz4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHAtPmNvbmZpZ3NbaV0sIDAsIGRwLT5udW1Db25maWdzW2ldLTEsIGNvbmZpZ3Nbal0pOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnc1tqXSA9IE1BS0VfQ09ORklHKGksIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTkZJRywgRUdMX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25maWdzICs9IG47CisgICAgICAgICAgICAgICAgY29uZmlnX3NpemUgLT0gbjsKKyAgICAgICAgICAgICAgICAqbnVtX2NvbmZpZyArPSBuOworICAgICAgICAgICAgICAgIHJlcyA9IEVHTF9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK0VHTEJvb2xlYW4gZWdsR2V0Q29uZmlnQXR0cmliKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKQoreworICAgIGVnbF9kaXNwbGF5X3QgY29uc3QqIGRwID0gMDsKKyAgICBpbnQgaT0wLCBpbmRleD0wOworICAgIGVnbF9jb25uZWN0aW9uX3QqIGNueCA9IHZhbGlkYXRlX2Rpc3BsYXlfY29uZmlnKGRweSwgY29uZmlnLCBkcCwgaSwgaW5kZXgpOworICAgIGlmICghY254KSByZXR1cm4gRUdMX0ZBTFNFOworICAgIAorICAgIGlmIChhdHRyaWJ1dGUgPT0gRUdMX0NPTkZJR19JRCkgeworICAgICAgICAvLyBFR0xfQ09ORklHX0lEcyBtdXN0IGJlIHVuaXF1ZSwganVzdCB1c2UgdGhlIG9yZGVyIG9mIHRoZSBzZWxlY3RlZAorICAgICAgICAvLyBFR0xDb25maWcuCisgICAgICAgICp2YWx1ZSA9IGNvbmZpZ1RvVW5pcXVlSWQoZHAsIGksIGluZGV4KTsKKyAgICAgICAgcmV0dXJuIEVHTF9UUlVFOworICAgIH0KKyAgICByZXR1cm4gY254LT5ob29rcy0+ZWdsLmVnbEdldENvbmZpZ0F0dHJpYigKKyAgICAgICAgICAgIGRwLT5kcHlzW2ldLCBkcC0+Y29uZmlnc1tpXVtpbmRleF0sIGF0dHJpYnV0ZSwgdmFsdWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzdXJmYWNlcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFR0xTdXJmYWNlIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoICBFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCA9IDA7CisgICAgaW50IGk9MCwgaW5kZXg9MDsKKyAgICBlZ2xfY29ubmVjdGlvbl90KiBjbnggPSB2YWxpZGF0ZV9kaXNwbGF5X2NvbmZpZyhkcHksIGNvbmZpZywgZHAsIGksIGluZGV4KTsKKyAgICBpZiAoY254KSB7CisgICAgICAgIC8vIHdpbmRvdyBtdXN0IGJlIGNvbm5lY3RlZCB1cG9uIGNhbGxpbmcgdW5kZXJseWluZworICAgICAgICAvLyBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlCisgICAgICAgIGlmICh3aW5kb3cpIHsKKyAgICAgICAgICAgIHdpbmRvdy0+aW5jUmVmKHdpbmRvdyk7CisgICAgICAgICAgICBpZiAod2luZG93LT5jb25uZWN0KQorICAgICAgICAgICAgICAgIHdpbmRvdy0+Y29ubmVjdCh3aW5kb3cpOworICAgICAgICB9CisKKyAgICAgICAgRUdMU3VyZmFjZSBzdXJmYWNlID0gY254LT5ob29rcy0+ZWdsLmVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoCisgICAgICAgICAgICAgICAgZHAtPmRweXNbaV0sIGRwLT5jb25maWdzW2ldW2luZGV4XSwgd2luZG93LCBhdHRyaWJfbGlzdCk7ICAgICAgIAorICAgICAgICBpZiAoc3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSkgeworICAgICAgICAgICAgZWdsX3N1cmZhY2VfdCogcyA9IG5ldyBlZ2xfc3VyZmFjZV90KGRweSwgc3VyZmFjZSwgd2luZG93LCBpLCBjbngpOworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nLCBkaXNjb25uZWN0IGFuZCBmcmVlIHdpbmRvdworICAgICAgICAvLyAod2lsbCBkaXNjb25uZWN0KCkgYXV0b21hdGljYWxseSkKKyAgICAgICAgaWYgKHdpbmRvdykgeworICAgICAgICAgICAgd2luZG93LT5kZWNSZWYod2luZG93KTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIHJldHVybiBFR0xfTk9fU1VSRkFDRTsKK30KKworRUdMU3VyZmFjZSBlZ2xDcmVhdGVQaXhtYXBTdXJmYWNlKCAgRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVQaXhtYXBUeXBlIHBpeG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCit7CisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCogZHAgPSAwOworICAgIGludCBpPTAsIGluZGV4PTA7CisgICAgZWdsX2Nvbm5lY3Rpb25fdCogY254ID0gdmFsaWRhdGVfZGlzcGxheV9jb25maWcoZHB5LCBjb25maWcsIGRwLCBpLCBpbmRleCk7CisgICAgaWYgKGNueCkgeworICAgICAgICBFR0xTdXJmYWNlIHN1cmZhY2UgPSBjbngtPmhvb2tzLT5lZ2wuZWdsQ3JlYXRlUGl4bWFwU3VyZmFjZSgKKyAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgZHAtPmNvbmZpZ3NbaV1baW5kZXhdLCBwaXhtYXAsIGF0dHJpYl9saXN0KTsKKyAgICAgICAgaWYgKHN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpIHsKKyAgICAgICAgICAgIGVnbF9zdXJmYWNlX3QqIHMgPSBuZXcgZWdsX3N1cmZhY2VfdChkcHksIHN1cmZhY2UsIE5VTEwsIGksIGNueCk7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRUdMX05PX1NVUkZBQ0U7Cit9CisKK0VHTFN1cmZhY2UgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoIEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCA9IDA7CisgICAgaW50IGk9MCwgaW5kZXg9MDsKKyAgICBlZ2xfY29ubmVjdGlvbl90KiBjbnggPSB2YWxpZGF0ZV9kaXNwbGF5X2NvbmZpZyhkcHksIGNvbmZpZywgZHAsIGksIGluZGV4KTsKKyAgICBpZiAoY254KSB7CisgICAgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZSA9IGNueC0+aG9va3MtPmVnbC5lZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZSgKKyAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgZHAtPmNvbmZpZ3NbaV1baW5kZXhdLCBhdHRyaWJfbGlzdCk7CisgICAgICAgIGlmIChzdXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgICAgICBlZ2xfc3VyZmFjZV90KiBzID0gbmV3IGVnbF9zdXJmYWNlX3QoZHB5LCBzdXJmYWNlLCBOVUxMLCBpLCBjbngpOworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEVHTF9OT19TVVJGQUNFOworfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitFR0xCb29sZWFuIGVnbERlc3Ryb3lTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpCit7CisgICAgaWYgKCF2YWxpZGF0ZV9kaXNwbGF5X3N1cmZhY2UoZHB5LCBzdXJmYWNlKSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsgICAgCisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBlZ2xfc3VyZmFjZV90IGNvbnN0ICogY29uc3QgcyA9IGdldF9zdXJmYWNlKHN1cmZhY2UpOworCisgICAgRUdMQm9vbGVhbiByZXN1bHQgPSBzLT5jbngtPmhvb2tzLT5lZ2wuZWdsRGVzdHJveVN1cmZhY2UoCisgICAgICAgICAgICBkcC0+ZHB5c1tzLT5pbXBsXSwgcy0+c3VyZmFjZSk7CisgICAgCisgICAgZGVsZXRlIHM7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworRUdMQm9vbGVhbiBlZ2xRdWVyeVN1cmZhY2UoIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSkKK3sKKyAgICBpZiAoIXZhbGlkYXRlX2Rpc3BsYXlfc3VyZmFjZShkcHksIHN1cmZhY2UpKQorICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOyAgICAKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOworICAgIGVnbF9zdXJmYWNlX3QgY29uc3QgKiBjb25zdCBzID0gZ2V0X3N1cmZhY2Uoc3VyZmFjZSk7CisKKyAgICByZXR1cm4gcy0+Y254LT5ob29rcy0+ZWdsLmVnbFF1ZXJ5U3VyZmFjZSgKKyAgICAgICAgICAgIGRwLT5kcHlzW3MtPmltcGxdLCBzLT5zdXJmYWNlLCBhdHRyaWJ1dGUsIHZhbHVlKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29udGV4dGVzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VHTENvbnRleHQgZWdsQ3JlYXRlQ29udGV4dChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb250ZXh0IHNoYXJlX2xpc3QsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCit7CisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCogZHAgPSAwOworICAgIGludCBpPTAsIGluZGV4PTA7CisgICAgZWdsX2Nvbm5lY3Rpb25fdCogY254ID0gdmFsaWRhdGVfZGlzcGxheV9jb25maWcoZHB5LCBjb25maWcsIGRwLCBpLCBpbmRleCk7CisgICAgaWYgKGNueCkgeworICAgICAgICBFR0xDb250ZXh0IGNvbnRleHQgPSBjbngtPmhvb2tzLT5lZ2wuZWdsQ3JlYXRlQ29udGV4dCgKKyAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgZHAtPmNvbmZpZ3NbaV1baW5kZXhdLCBzaGFyZV9saXN0LCBhdHRyaWJfbGlzdCk7CisgICAgICAgIGlmIChjb250ZXh0ICE9IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgICAgICBlZ2xfY29udGV4dF90KiBjID0gbmV3IGVnbF9jb250ZXh0X3QoZHB5LCBjb250ZXh0LCBpLCBjbngpOworICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEVHTF9OT19DT05URVhUOworfQorCitFR0xCb29sZWFuIGVnbERlc3Ryb3lDb250ZXh0KEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCkKK3sKKyAgICBpZiAoIXZhbGlkYXRlX2Rpc3BsYXlfY29udGV4dChkcHksIGN0eCkpCisgICAgICAgIHJldHVybiBFR0xfRkFMU0U7CisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBlZ2xfY29udGV4dF90ICogY29uc3QgYyA9IGdldF9jb250ZXh0KGN0eCk7CisgICAgRUdMQm9vbGVhbiByZXN1bHQgPSBjLT5jbngtPmhvb2tzLT5lZ2wuZWdsRGVzdHJveUNvbnRleHQoCisgICAgICAgICAgICBkcC0+ZHB5c1tjLT5pbXBsXSwgYy0+Y29udGV4dCk7CisgICAgZGVsZXRlIGM7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworRUdMQm9vbGVhbiBlZ2xNYWtlQ3VycmVudCggIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMU3VyZmFjZSByZWFkLCBFR0xDb250ZXh0IGN0eCkKK3sKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOworICAgIGlmICghZHApIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisKKyAgICBpZiAocmVhZCA9PSBFR0xfTk9fU1VSRkFDRSAmJiBkcmF3ICA9PSBFR0xfTk9fU1VSRkFDRSAmJgorICAgICAgICAgICAgY3R4ID09IEVHTF9OT19DT05URVhUKSAKKyAgICB7CisgICAgICAgIEVHTEJvb2xlYW4gcmVzdWx0ID0gRUdMX1RSVUU7CisgICAgICAgIGN0eCA9IGdldENvbnRleHQoKTsKKyAgICAgICAgaWYgKGN0eCkgeworICAgICAgICAgICAgZWdsX2NvbnRleHRfdCAqIGNvbnN0IGMgPSBnZXRfY29udGV4dChjdHgpOworICAgICAgICAgICAgcmVzdWx0ID0gYy0+Y254LT5ob29rcy0+ZWdsLmVnbE1ha2VDdXJyZW50KGRwLT5kcHlzW2MtPmltcGxdLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gRUdMX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBzZXRHbFRocmVhZFNwZWNpZmljKCZnSG9va3NbSU1QTF9OT19DT05URVhUXSk7CisgICAgICAgICAgICAgICAgc2V0Q29udGV4dChFR0xfTk9fQ09OVEVYVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBpZiAoIXZhbGlkYXRlX2Rpc3BsYXlfY29udGV4dChkcHksIGN0eCkpCisgICAgICAgIHJldHVybiBFR0xfRkFMU0U7ICAgIAorICAgIAorICAgIGVnbF9jb250ZXh0X3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKKyAgICBpZiAoZHJhdyAhPSBFR0xfTk9fU1VSRkFDRSkgeworICAgICAgICBlZ2xfc3VyZmFjZV90IGNvbnN0ICogZCA9IGdldF9zdXJmYWNlKGRyYXcpOworICAgICAgICBpZiAoIWQpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1NVUkZBQ0UsIEVHTF9GQUxTRSk7CisgICAgICAgIGlmIChkLT5pbXBsICE9IGMtPmltcGwpCisgICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX0ZBTFNFKTsKKyAgICAgICAgZHJhdyA9IGQtPnN1cmZhY2U7CisgICAgfQorICAgIGlmIChyZWFkICE9IEVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgIGVnbF9zdXJmYWNlX3QgY29uc3QgKiByID0gZ2V0X3N1cmZhY2UocmVhZCk7CisgICAgICAgIGlmICghcikgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKKyAgICAgICAgaWYgKHItPmltcGwgIT0gYy0+aW1wbCkKKyAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfRkFMU0UpOworICAgICAgICByZWFkID0gci0+c3VyZmFjZTsKKyAgICB9CisgICAgRUdMQm9vbGVhbiByZXN1bHQgPSBjLT5jbngtPmhvb2tzLT5lZ2wuZWdsTWFrZUN1cnJlbnQoCisgICAgICAgICAgICBkcC0+ZHB5c1tjLT5pbXBsXSwgZHJhdywgcmVhZCwgYy0+Y29udGV4dCk7CisKKyAgICBpZiAocmVzdWx0ID09IEVHTF9UUlVFKSB7CisgICAgICAgIHNldEdsVGhyZWFkU3BlY2lmaWMoYy0+Y254LT5ob29rcyk7CisgICAgICAgIHNldENvbnRleHQoY3R4KTsKKyAgICAgICAgYy0+cmVhZCA9IHJlYWQ7CisgICAgICAgIGMtPmRyYXcgPSBkcmF3OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK0VHTEJvb2xlYW4gZWdsUXVlcnlDb250ZXh0KCBFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSkKK3sKKyAgICBpZiAoIXZhbGlkYXRlX2Rpc3BsYXlfY29udGV4dChkcHksIGN0eCkpCisgICAgICAgIHJldHVybiBFR0xfRkFMU0U7ICAgIAorICAgIAorICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgZWdsX2NvbnRleHRfdCAqIGNvbnN0IGMgPSBnZXRfY29udGV4dChjdHgpOworCisgICAgcmV0dXJuIGMtPmNueC0+aG9va3MtPmVnbC5lZ2xRdWVyeUNvbnRleHQoCisgICAgICAgICAgICBkcC0+ZHB5c1tjLT5pbXBsXSwgYy0+Y29udGV4dCwgYXR0cmlidXRlLCB2YWx1ZSk7Cit9CisKK0VHTENvbnRleHQgZWdsR2V0Q3VycmVudENvbnRleHQodm9pZCkKK3sKKyAgICBFR0xDb250ZXh0IGN0eCA9IGdldENvbnRleHQoKTsKKyAgICByZXR1cm4gY3R4OworfQorCitFR0xTdXJmYWNlIGVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTGludCByZWFkZHJhdykKK3sKKyAgICBFR0xDb250ZXh0IGN0eCA9IGdldENvbnRleHQoKTsKKyAgICBpZiAoY3R4KSB7CisgICAgICAgIGVnbF9jb250ZXh0X3QgY29uc3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKKyAgICAgICAgaWYgKCFjKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfTk9fU1VSRkFDRSk7CisgICAgICAgIHN3aXRjaCAocmVhZGRyYXcpIHsKKyAgICAgICAgICAgIGNhc2UgRUdMX1JFQUQ6IHJldHVybiBjLT5yZWFkOworICAgICAgICAgICAgY2FzZSBFR0xfRFJBVzogcmV0dXJuIGMtPmRyYXc7ICAgICAgICAgICAgCisgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9OT19TVVJGQUNFKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRUdMX05PX1NVUkZBQ0U7Cit9CisKK0VHTERpc3BsYXkgZWdsR2V0Q3VycmVudERpc3BsYXkodm9pZCkKK3sKKyAgICBFR0xDb250ZXh0IGN0eCA9IGdldENvbnRleHQoKTsKKyAgICBpZiAoY3R4KSB7CisgICAgICAgIGVnbF9jb250ZXh0X3QgY29uc3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKKyAgICAgICAgaWYgKCFjKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfTk9fU1VSRkFDRSk7CisgICAgICAgIHJldHVybiBjLT5kcHk7CisgICAgfQorICAgIHJldHVybiBFR0xfTk9fRElTUExBWTsKK30KKworRUdMQm9vbGVhbiBlZ2xXYWl0R0wodm9pZCkKK3sKKyAgICBFR0xCb29sZWFuIHJlcyA9IEVHTF9UUlVFOworICAgIEVHTENvbnRleHQgY3R4ID0gZ2V0Q29udGV4dCgpOworICAgIGlmIChjdHgpIHsKKyAgICAgICAgZWdsX2NvbnRleHRfdCBjb25zdCAqIGNvbnN0IGMgPSBnZXRfY29udGV4dChjdHgpOworICAgICAgICBpZiAoIWMpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7CisgICAgICAgIGlmICh1aW50MzJfdChjLT5pbXBsKT49MikKKyAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7CisgICAgICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbFtjLT5pbXBsXTsKKyAgICAgICAgaWYgKCFjbngtPmRzbykgCisgICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfRkFMU0UpOworICAgICAgICByZXMgPSBjbngtPmhvb2tzLT5lZ2wuZWdsV2FpdEdMKCk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK0VHTEJvb2xlYW4gZWdsV2FpdE5hdGl2ZShFR0xpbnQgZW5naW5lKQoreworICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX1RSVUU7CisgICAgRUdMQ29udGV4dCBjdHggPSBnZXRDb250ZXh0KCk7CisgICAgaWYgKGN0eCkgeworICAgICAgICBlZ2xfY29udGV4dF90IGNvbnN0ICogY29uc3QgYyA9IGdldF9jb250ZXh0KGN0eCk7CisgICAgICAgIGlmICghYykgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX0ZBTFNFKTsKKyAgICAgICAgaWYgKHVpbnQzMl90KGMtPmltcGwpPj0yKQorICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX0ZBTFNFKTsKKyAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2MtPmltcGxdOworICAgICAgICBpZiAoIWNueC0+ZHNvKSAKKyAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7CisgICAgICAgIHJlcyA9IGNueC0+aG9va3MtPmVnbC5lZ2xXYWl0TmF0aXZlKGVuZ2luZSk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK0VHTGludCBlZ2xHZXRFcnJvcih2b2lkKQoreworICAgIEVHTGludCByZXN1bHQgPSBFR0xfU1VDQ0VTUzsKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgRUdMaW50IGVyciA9IEVHTF9TVUNDRVNTOworICAgICAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGxbaV07CisgICAgICAgIGlmIChjbngtPmRzbykKKyAgICAgICAgICAgIGVyciA9IGNueC0+aG9va3MtPmVnbC5lZ2xHZXRFcnJvcigpOworICAgICAgICBpZiAoZXJyIT1FR0xfU1VDQ0VTUyAmJiByZXN1bHQ9PUVHTF9TVUNDRVNTKQorICAgICAgICAgICAgcmVzdWx0ID0gZXJyOworICAgIH0KKyAgICBpZiAocmVzdWx0ID09IEVHTF9TVUNDRVNTKQorICAgICAgICByZXN1bHQgPSBnZXRFcnJvcigpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgKCplZ2xHZXRQcm9jQWRkcmVzcyhjb25zdCBjaGFyICpwcm9jbmFtZSkpKCkKK3sKKyAgICBfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIGFkZHI7CisgICAgYWRkciA9IGZpbmRQcm9jQWRkcmVzcyhwcm9jbmFtZSwgZ0V4dGVudGlvbk1hcCwgTkVMRU0oZ0V4dGVudGlvbk1hcCkpOworICAgIGlmIChhZGRyKSByZXR1cm4gYWRkcjsKKworICAgIHJldHVybiBOVUxMOyAvLyBUT0RPOiBmaW5pc2ggaW1wbGVtZW50YXRpb24gYmVsb3cKKworICAgIGFkZHIgPSBmaW5kUHJvY0FkZHJlc3MocHJvY25hbWUsIGdHTEV4dGVudGlvbk1hcCwgTkVMRU0oZ0dMRXh0ZW50aW9uTWFwKSk7CisgICAgaWYgKGFkZHIpIHJldHVybiBhZGRyOworICAgIAorICAgIGFkZHIgPSAwOworICAgIGludCBzbG90ID0gLTE7CisgICAgZm9yIChpbnQgaT0wIDsgaTwyIDsgaSsrKSB7CisgICAgICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbFtpXTsKKyAgICAgICAgaWYgKGNueC0+ZHNvKSB7CisgICAgICAgICAgICBpZiAoY254LT5ob29rcy0+ZWdsLmVnbEdldFByb2NBZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgYWRkciA9IGNueC0+aG9va3MtPmVnbC5lZ2xHZXRQcm9jQWRkcmVzcyhwcm9jbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGFkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNsb3QgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QgPSAwOyAvLyBYWFg6IGZpbmQgZnJlZSBzbG90CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2xvdCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNueC0+aG9va3MtPmV4dC5leHRlbnNpb25zW3Nsb3RdID0gYWRkcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKHNsb3QgPj0gMCkgeworICAgICAgICBhZGRyID0gMDsgLy8gWFhYOiBhZGRyZXNzIG9mIHN0dWIgJ3Nsb3QnCisgICAgICAgIGdHTEV4dGVudGlvbk1hcFtzbG90XS5uYW1lID0gc3RyZHVwKHByb2NuYW1lKTsKKyAgICAgICAgZ0dMRXh0ZW50aW9uTWFwW3Nsb3RdLmFkZHJlc3MgPSBhZGRyOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gYWRkcjsKKworICAgIAorICAgIC8qCisgICAgICogIFRPRE86IEZvciBPcGVuR0wgRVMgZXh0ZW5zaW9ucywgd2UgbXVzdCBnZW5lcmF0ZSBhIHN0dWIKKyAgICAgKiAgdGhhdCBsb29rcyBsaWtlCisgICAgICogICAgICBtb3YgICAgIHIxMiwgIzB4RkZGRjBGRkYKKyAgICAgKiAgICAgIGxkciAgICAgcjEyLCBbcjEyLCAjLTE1XQorICAgICAqICAgICAgbGRyICAgICByMTIsIFtyMTIsICNUTFNfU0xPVF9PUEVOR0xfQVBJKjRdCisgICAgICogICAgICBtb3YgICAgIHIxMiwgW3IxMiwgI2FwaV9vZmZzZXRdCisgICAgICogICAgICBsZHJuZSAgIHBjLCByMTIKKyAgICAgKiAgICAgIG1vdiAgICAgcGMsICN1bnN1cHBvcnRlZF9leHRlbnNpb24KKyAgICAgKiAKKyAgICAgKiAgYW5kIHdyaXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBleHRlbnNpb24gaW4gKmFsbCoKKyAgICAgKiAgZ2xfaG9va3NfdDo6Z2xfZXh0X3QgYXQgb2Zmc2V0ICJhcGlfb2Zmc2V0IiBmcm9tIGdsX2hvb2tzX3QKKyAgICAgKiAKKyAgICAgKi8KK30KKworRUdMQm9vbGVhbiBlZ2xTd2FwQnVmZmVycyhFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3KQoreworICAgIGlmICghdmFsaWRhdGVfZGlzcGxheV9zdXJmYWNlKGRweSwgZHJhdykpCisgICAgICAgIHJldHVybiBFR0xfRkFMU0U7ICAgIAorICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgZWdsX3N1cmZhY2VfdCBjb25zdCAqIGNvbnN0IHMgPSBnZXRfc3VyZmFjZShkcmF3KTsKKyAgICByZXR1cm4gcy0+Y254LT5ob29rcy0+ZWdsLmVnbFN3YXBCdWZmZXJzKGRwLT5kcHlzW3MtPmltcGxdLCBzLT5zdXJmYWNlKTsKK30KKworRUdMQm9vbGVhbiBlZ2xDb3B5QnVmZmVycyggIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlUGl4bWFwVHlwZSB0YXJnZXQpCit7CisgICAgaWYgKCF2YWxpZGF0ZV9kaXNwbGF5X3N1cmZhY2UoZHB5LCBzdXJmYWNlKSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsgICAgCisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBlZ2xfc3VyZmFjZV90IGNvbnN0ICogY29uc3QgcyA9IGdldF9zdXJmYWNlKHN1cmZhY2UpOworICAgIHJldHVybiBzLT5jbngtPmhvb2tzLT5lZ2wuZWdsQ29weUJ1ZmZlcnMoCisgICAgICAgICAgICBkcC0+ZHB5c1tzLT5pbXBsXSwgcy0+c3VyZmFjZSwgdGFyZ2V0KTsKK30KKworY29uc3QgY2hhciogZWdsUXVlcnlTdHJpbmcoRUdMRGlzcGxheSBkcHksIEVHTGludCBuYW1lKQoreworICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgc3dpdGNoIChuYW1lKSB7CisgICAgICAgIGNhc2UgRUdMX1ZFTkRPUjoKKyAgICAgICAgICAgIHJldHVybiBnVmVuZG9yU3RyaW5nOworICAgICAgICBjYXNlIEVHTF9WRVJTSU9OOgorICAgICAgICAgICAgcmV0dXJuIGdWZXJzaW9uU3RyaW5nOworICAgICAgICBjYXNlIEVHTF9FWFRFTlNJT05TOgorICAgICAgICAgICAgcmV0dXJuIGdFeHRlbnNpb25TdHJpbmc7CisgICAgICAgIGNhc2UgRUdMX0NMSUVOVF9BUElTOgorICAgICAgICAgICAgcmV0dXJuIGdDbGllbnRBcGlTdHJpbmc7CisgICAgfQorICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgKGNvbnN0IGNoYXIgKikwKTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFR0wgMS4xCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VHTEJvb2xlYW4gZWdsU3VyZmFjZUF0dHJpYigKKyAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50IHZhbHVlKQoreworICAgIGlmICghdmFsaWRhdGVfZGlzcGxheV9zdXJmYWNlKGRweSwgc3VyZmFjZSkpCisgICAgICAgIHJldHVybiBFR0xfRkFMU0U7ICAgIAorICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgZWdsX3N1cmZhY2VfdCBjb25zdCAqIGNvbnN0IHMgPSBnZXRfc3VyZmFjZShzdXJmYWNlKTsKKyAgICBpZiAocy0+Y254LT5ob29rcy0+ZWdsLmVnbFN1cmZhY2VBdHRyaWIpIHsKKyAgICAgICAgcmV0dXJuIHMtPmNueC0+aG9va3MtPmVnbC5lZ2xTdXJmYWNlQXR0cmliKAorICAgICAgICAgICAgICAgIGRwLT5kcHlzW3MtPmltcGxdLCBzLT5zdXJmYWNlLCBhdHRyaWJ1dGUsIHZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKK30KKworRUdMQm9vbGVhbiBlZ2xCaW5kVGV4SW1hZ2UoCisgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBidWZmZXIpCit7CisgICAgaWYgKCF2YWxpZGF0ZV9kaXNwbGF5X3N1cmZhY2UoZHB5LCBzdXJmYWNlKSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsgICAgCisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBlZ2xfc3VyZmFjZV90IGNvbnN0ICogY29uc3QgcyA9IGdldF9zdXJmYWNlKHN1cmZhY2UpOworICAgIGlmIChzLT5jbngtPmhvb2tzLT5lZ2wuZWdsQmluZFRleEltYWdlKSB7CisgICAgICAgIHJldHVybiBzLT5jbngtPmhvb2tzLT5lZ2wuZWdsQmluZFRleEltYWdlKAorICAgICAgICAgICAgICAgIGRwLT5kcHlzW3MtPmltcGxdLCBzLT5zdXJmYWNlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOworfQorCitFR0xCb29sZWFuIGVnbFJlbGVhc2VUZXhJbWFnZSgKKyAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGJ1ZmZlcikKK3sKKyAgICBpZiAoIXZhbGlkYXRlX2Rpc3BsYXlfc3VyZmFjZShkcHksIHN1cmZhY2UpKQorICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOyAgICAKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOworICAgIGVnbF9zdXJmYWNlX3QgY29uc3QgKiBjb25zdCBzID0gZ2V0X3N1cmZhY2Uoc3VyZmFjZSk7CisgICAgaWYgKHMtPmNueC0+aG9va3MtPmVnbC5lZ2xSZWxlYXNlVGV4SW1hZ2UpIHsKKyAgICAgICAgcmV0dXJuIHMtPmNueC0+aG9va3MtPmVnbC5lZ2xSZWxlYXNlVGV4SW1hZ2UoCisgICAgICAgICAgICAgICAgZHAtPmRweXNbcy0+aW1wbF0sIHMtPnN1cmZhY2UsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1NVUkZBQ0UsIEVHTF9GQUxTRSk7Cit9CisKK0VHTEJvb2xlYW4gZWdsU3dhcEludGVydmFsKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgaW50ZXJ2YWwpCit7CisgICAgZWdsX2Rpc3BsYXlfdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBpZiAoIWRwKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworCisgICAgRUdMQm9vbGVhbiByZXMgPSBFR0xfVFJVRTsKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOworICAgICAgICBpZiAoY254LT5kc28pIHsKKyAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsU3dhcEludGVydmFsKSB7CisgICAgICAgICAgICAgICAgaWYgKGNueC0+aG9va3MtPmVnbC5lZ2xTd2FwSW50ZXJ2YWwoZHAtPmRweXNbaV0sIGludGVydmFsKSA9PSBFR0xfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gRUdMX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVHTCAxLjIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRUdMQm9vbGVhbiBlZ2xXYWl0Q2xpZW50KHZvaWQpCit7CisgICAgRUdMQm9vbGVhbiByZXMgPSBFR0xfVFJVRTsKKyAgICBFR0xDb250ZXh0IGN0eCA9IGdldENvbnRleHQoKTsKKyAgICBpZiAoY3R4KSB7CisgICAgICAgIGVnbF9jb250ZXh0X3QgY29uc3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKKyAgICAgICAgaWYgKCFjKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfRkFMU0UpOworICAgICAgICBpZiAodWludDMyX3QoYy0+aW1wbCk+PTIpCisgICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfRkFMU0UpOworICAgICAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGxbYy0+aW1wbF07CisgICAgICAgIGlmICghY254LT5kc28pIAorICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX0ZBTFNFKTsKKyAgICAgICAgaWYgKGNueC0+aG9va3MtPmVnbC5lZ2xXYWl0Q2xpZW50KSB7CisgICAgICAgICAgICByZXMgPSBjbngtPmhvb2tzLT5lZ2wuZWdsV2FpdENsaWVudCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gY254LT5ob29rcy0+ZWdsLmVnbFdhaXRHTCgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK0VHTEJvb2xlYW4gZWdsQmluZEFQSShFR0xlbnVtIGFwaSkKK3sKKyAgICAvLyBiaW5kIHRoaXMgQVBJIG9uIGFsbCBFR0xzCisgICAgRUdMQm9vbGVhbiByZXMgPSBFR0xfVFJVRTsKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOworICAgICAgICBpZiAoY254LT5kc28pIHsKKyAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsQmluZEFQSSkgeworICAgICAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsQmluZEFQSShhcGkpID09IEVHTF9GQUxTRSkgeworICAgICAgICAgICAgICAgICAgICByZXMgPSBFR0xfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK0VHTGVudW0gZWdsUXVlcnlBUEkodm9pZCkKK3sKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOworICAgICAgICBpZiAoY254LT5kc28pIHsKKyAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlBUEkpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgZmlyc3Qgb25lIHdlIGZpbmQgaXMgb2theSwgYmVjYXVzZSB0aGV5IGFsbAorICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSB0aGUgc2FtZQorICAgICAgICAgICAgICAgIHJldHVybiBjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlBUEkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBvciwgaXQgY2FuIG9ubHkgYmUgT3BlbkdMIEVTCisgICAgcmV0dXJuIEVHTF9PUEVOR0xfRVNfQVBJOworfQorCitFR0xCb29sZWFuIGVnbFJlbGVhc2VUaHJlYWQodm9pZCkKK3sKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOworICAgICAgICBpZiAoY254LT5kc28pIHsKKyAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsUmVsZWFzZVRocmVhZCkgeworICAgICAgICAgICAgICAgIGNueC0+aG9va3MtPmVnbC5lZ2xSZWxlYXNlVGhyZWFkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY2xlYXJUTFMoKTsgICAgCisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCitFR0xTdXJmYWNlIGVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyKAorICAgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIGJ1ZnR5cGUsIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsCisgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0KiBkcCA9IDA7CisgICAgaW50IGk9MCwgaW5kZXg9MDsKKyAgICBlZ2xfY29ubmVjdGlvbl90KiBjbnggPSB2YWxpZGF0ZV9kaXNwbGF5X2NvbmZpZyhkcHksIGNvbmZpZywgZHAsIGksIGluZGV4KTsKKyAgICBpZiAoIWNueCkgcmV0dXJuIEVHTF9GQUxTRTsKKyAgICBpZiAoY254LT5ob29rcy0+ZWdsLmVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyKSB7CisgICAgICAgIHJldHVybiBjbngtPmhvb2tzLT5lZ2wuZWdsQ3JlYXRlUGJ1ZmZlckZyb21DbGllbnRCdWZmZXIoCisgICAgICAgICAgICAgICAgZHAtPmRweXNbaV0sIGJ1ZnR5cGUsIGJ1ZmZlciwgZHAtPmNvbmZpZ3NbaV1baW5kZXhdLCBhdHRyaWJfbGlzdCk7CisgICAgfQorICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTkZJRywgRUdMX05PX1NVUkZBQ0UpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML2dwdS5jcHAgYi9vcGVuZ2wvbGlicy9FR0wvZ3B1LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjlmZDYzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYnMvRUdML2dwdS5jcHAKQEAgLTAsMCArMSwyMTIgQEAKKy8qIAorICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICoqCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVHTCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaWYgSEFWRV9BTkRST0lEX09TCisjaW5jbHVkZSA8bGludXgvYW5kcm9pZF9wbWVtLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvSU1lbW9yeS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx1dGlscy9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL1BhcmNlbC5oPgorCisjaW5jbHVkZSA8dWkvRUdMRGlzcGxheVN1cmZhY2UuaD4KKyNpbmNsdWRlIDx1aS9JU3VyZmFjZUNvbXBvc2VyLmg+CisKKyNpbmNsdWRlICJob29rcy5oIgorI2luY2x1ZGUgImVnbF9pbXBsLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAqIHdlIHByb3ZpZGUgb3VyIG93biBhbGxvY2F0b3JzIGZvciB0aGUgR1BVIHJlZ2lvbnMsIHRoZXNlCisgKiBhbGxvY2F0b3JzIGdvIHRocm91Z2ggc3VyZmFjZWZsaW5nZXIgCisgKi8KKworc3RhdGljIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdSZWdpb25zTG9jazsKK3N0YXRpYyByZXF1ZXN0X2dwdV90ICAgICAgICAgICAgICAgICAgICBnUmVnaW9uczsKK3N0YXRpYyBzcDxJU3VyZmFjZUNvbXBvc2VyPiAgICAgICAgICAgICBnU3VyZmFjZU1hbmFnZXI7CitJU3VyZmFjZUNvbXBvc2VyKiAgICAgICAgICAgICAgICAgICAgICAgR0xFU19sb2NhbFN1cmZhY2VNYW5hZ2VyID0gMDsKKworZXh0ZXJuIGVnbF9jb25uZWN0aW9uX3QgZ0VHTEltcGxbMl07CisKK2NvbnN0IHNwPElTdXJmYWNlQ29tcG9zZXI+JiBnZXRTdXJmYWNlRmxpbmdlcigpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdSZWdpb25zTG9jayk7CisKKyAgICAvKgorICAgICAqIFRoZXJlIGlzIGEgbGl0dGxlIGJpdCBvZiB2b29kb28gbWFnaWMgaGVyZS4gV2Ugd2FudCB0byBhY2Nlc3MKKyAgICAgKiBzdXJmYWNlZmxpbmdlciBmb3IgYWxsb2NhdGluZyBHUFUgcmVnaW9ucywgaG93ZXZlciwgd2hlbiB3ZSBhcmUKKyAgICAgKiBydW5uaW5nIGFzIHBhcnQgb2Ygc3VyZmFjZWZsaW5nZXIsIHdlIHdhbnQgdG8gYnlwYXNzIHRoZQorICAgICAqIHNlcnZpY2UgbWFuYWdlciBiZWNhdXNlIHN1cmZhY2VmbGluZ2VyIG1pZ2h0IG5vdCBiZSByZWdpc3RlcmVkIHlldC4KKyAgICAgKiBTdXJmYWNlRmxpbmdlciB3aWxsIHBvcHVsYXRlICJHTEVTX2xvY2FsU3VyZmFjZU1hbmFnZXIiIHdpdGggaXRzCisgICAgICogb3duIGFkZHJlc3MsIHNvIHdlIGNhbiBqdXN0IHVzZSB0aGF0LgorICAgICAqLworICAgIGlmIChnU3VyZmFjZU1hbmFnZXIgPT0gMCkgeworICAgICAgICBpZiAoR0xFU19sb2NhbFN1cmZhY2VNYW5hZ2VyKSB7CisgICAgICAgICAgICAvLyB3ZSdyZSBydW5uaW5nIGluIFN1cmZhY2VGbGluZ2VyJ3MgY29udGV4dAorICAgICAgICAgICAgZ1N1cmZhY2VNYW5hZ2VyID0gIEdMRVNfbG9jYWxTdXJmYWNlTWFuYWdlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHdlJ3JlIGEgcmVtb3RlIHByb2Nlc3Mgb3Igbm90IHBhcnQgb2Ygc3VyZmFjZWZsaW5nZXIsCisgICAgICAgICAgICAvLyBnbyB0aHJvdWdoIHRoZSBzZXJ2aWNlIG1hbmFnZXIKKyAgICAgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgICAgIGlmIChzbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIlN1cmZhY2VGbGluZ2VyIikpOworICAgICAgICAgICAgICAgIGdTdXJmYWNlTWFuYWdlciA9IGludGVyZmFjZV9jYXN0PElTdXJmYWNlQ29tcG9zZXI+KGJpbmRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGdTdXJmYWNlTWFuYWdlcjsKK30KKworY2xhc3MgR1BVUmV2b2tlUmVxdWVzdGVyIDogcHVibGljIEJuR1BVQ2FsbGJhY2sKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgZ3B1TG9zdCgpIHsKKyAgICAgICAgTE9HRCgiQ09OVEVYVF9MT1NUOiBSZWxlYXNpbmcgR1BVIHVwb24gcmVxdWVzdCBmcm9tIFN1cmZhY2VGbGluZ2VyLiIpOworICAgICAgICBnRUdMSW1wbFtJTVBMX0hBUkRXQVJFXS5ob29rcyA9ICZnSG9va3NbSU1QTF9DT05URVhUX0xPU1RdOworICAgIH0KK307CisKK3N0YXRpYyBzcDxHUFVSZXZva2VSZXF1ZXN0ZXI+IGdSZXZva2VyQ2FsbGJhY2s7CisKKworcmVxdWVzdF9ncHVfdCogZ3B1X2FjcXVpcmUodm9pZCogdXNlcikKK3sKKyAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBzZXJ2ZXIoIGdldFN1cmZhY2VGbGluZ2VyKCkgKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChnUmVnaW9uc0xvY2spOworICAgIGlmIChzZXJ2ZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgSVN1cmZhY2VDb21wb3Nlcjo6Z3B1X2luZm9fdCBpbmZvOworICAgIAorICAgIGlmIChnUmV2b2tlckNhbGxiYWNrID09IDApCisgICAgICAgIGdSZXZva2VyQ2FsbGJhY2sgPSBuZXcgR1BVUmV2b2tlUmVxdWVzdGVyKCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBzZXJ2ZXItPnJlcXVlc3RHUFUoZ1Jldm9rZXJDYWxsYmFjaywgJmluZm8pOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRCgicmVxdWVzdEdQVSByZXR1cm5lZCAlZCIsIGVycik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgcmVxdWVzdF9ncHVfdCogZ3B1ID0gJmdSZWdpb25zOworICAgIG1lbXNldChncHUsIDAsIHNpemVvZigqZ3B1KSk7CisgICAgCisgICAgaWYgKGluZm8ucmVncyAhPSAwKSB7CisgICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwKGluZm8ucmVncy0+Z2V0TWVtb3J5KCkpOworICAgICAgICBpZiAoaGVhcCAhPSAwKSB7CisgICAgICAgICAgICBpbnQgZmQgPSBoZWFwLT5oZWFwSUQoKTsKKyAgICAgICAgICAgIGdwdS0+cmVncy5mZCA9IGZkOworICAgICAgICAgICAgZ3B1LT5yZWdzLmJhc2UgPSBpbmZvLnJlZ3MtPnBvaW50ZXIoKTsgCisgICAgICAgICAgICBncHUtPnJlZ3Muc2l6ZSA9IGluZm8ucmVncy0+c2l6ZSgpOyAKKyAgICAgICAgICAgIGdwdS0+cmVncy51c2VyID0gaW5mby5yZWdzLmdldCgpOworI2lmIEhBVkVfQU5EUk9JRF9PUworICAgICAgICAgICAgc3RydWN0IHBtZW1fcmVnaW9uIHJlZ2lvbjsKKyAgICAgICAgICAgIGlmIChpb2N0bChmZCwgUE1FTV9HRVRfUEhZUywgJnJlZ2lvbikgPj0gMCkKKyAgICAgICAgICAgICAgICBncHUtPnJlZ3MucGh5cyA9ICh2b2lkKilyZWdpb24ub2Zmc2V0OworI2VuZGlmCisgICAgICAgICAgICBpbmZvLnJlZ3MtPmluY1N0cm9uZyhncHUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiR1BVIHJlZ2lzdGVyIGhhbmRsZSAlcCBpcyBpbnZhbGlkISIsIGluZm8ucmVncy5nZXQoKSk7CisgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaT0wIDsgaTxpbmZvLmNvdW50ICYmICFmYWlsZWQgOyBpKyspIHsKKyAgICAgICAgc3A8SU1lbW9yeT4mIHJlZ2lvbihpbmZvLnJlZ2lvbnNbaV0ucmVnaW9uKTsKKyAgICAgICAgaWYgKHJlZ2lvbiAhPSAwKSB7CisgICAgICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcChyZWdpb24tPmdldE1lbW9yeSgpKTsKKyAgICAgICAgICAgIGlmIChoZWFwICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgZmQgPSBoZWFwLT5oZWFwSUQoKTsKKyAgICAgICAgICAgICAgICBncHUtPmdwdVtpXS5mZCA9IGZkOworICAgICAgICAgICAgICAgIGdwdS0+Z3B1W2ldLmJhc2UgPSByZWdpb24tPnBvaW50ZXIoKTsgCisgICAgICAgICAgICAgICAgZ3B1LT5ncHVbaV0uc2l6ZSA9IHJlZ2lvbi0+c2l6ZSgpOyAKKyAgICAgICAgICAgICAgICBncHUtPmdwdVtpXS51c2VyID0gcmVnaW9uLmdldCgpOworICAgICAgICAgICAgICAgIGdwdS0+Z3B1W2ldLm9mZnNldCA9IGluZm8ucmVnaW9uc1tpXS5yZXNlcnZlZDsKKyNpZiBIQVZFX0FORFJPSURfT1MKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcG1lbV9yZWdpb24gcmVnOworICAgICAgICAgICAgICAgIGlmIChpb2N0bChmZCwgUE1FTV9HRVRfUEhZUywgJnJlZykgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgZ3B1LT5ncHVbaV0ucGh5cyA9ICh2b2lkKilyZWcub2Zmc2V0OworI2VuZGlmCisgICAgICAgICAgICAgICAgcmVnaW9uLT5pbmNTdHJvbmcoZ3B1KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiR1BVIHJlZ2lvbiBoYW5kbGUgWyVkLCAlcF0gaXMgaW52YWxpZCEiLCBpLCByZWdpb24uZ2V0KCkpOworICAgICAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZywgY2xlYW4gdXAgZXZlcnl0aGluZyEKKyAgICAgICAgaWYgKGdwdS0+cmVncy51c2VyKSB7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxJTWVtb3J5Kj4oZ3B1LT5yZWdzLnVzZXIpLT5kZWNTdHJvbmcoZ3B1KTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8aW5mby5jb3VudCA7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChncHUtPmdwdVtpXS51c2VyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PElNZW1vcnkqPihncHUtPmdwdVtpXS51c2VyKS0+ZGVjU3Ryb25nKGdwdSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIGdwdS0+Y291bnQgPSBpbmZvLmNvdW50OworICAgIHJldHVybiBncHU7Cit9CisKK2ludCBncHVfcmVsZWFzZSh2b2lkKiwgcmVxdWVzdF9ncHVfdCogZ3B1KQoreworICAgIHNwPElNZW1vcnk+IHJlZ3M7CisKKyAgICB7IC8vIHNjb3BlIGZvciBsb2NrCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnUmVnaW9uc0xvY2spOworICAgICAgICByZWdzID0gc3RhdGljX2Nhc3Q8SU1lbW9yeSo+KGdwdS0+cmVncy51c2VyKTsgICAKKyAgICAgICAgZ3B1LT5yZWdzLnVzZXIgPSAwOworICAgICAgICBpZiAocmVncyAhPSAwKSByZWdzLT5kZWNTdHJvbmcoZ3B1KTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8Z3B1LT5jb3VudCA7IGkrKykgeworICAgICAgICAgICAgc3A8SU1lbW9yeT4gcihzdGF0aWNfY2FzdDxJTWVtb3J5Kj4oZ3B1LT5ncHVbaV0udXNlcikpOworICAgICAgICAgICAgZ3B1LT5ncHVbaV0udXNlciA9IDA7CisgICAgICAgICAgICBpZiAociAhPSAwKSByLT5kZWNTdHJvbmcoZ3B1KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyB0aGVyZSBpcyBhIHNwZWNpYWwgdHJhbnNhY3Rpb24gdG8gcmVsaW5xdWlzaCB0aGUgR1BVCisgICAgLy8gKGl0IHdpbGwgaGFwcGVuIGF1dG9tYXRpY2FsbHkgYW55d2F5IGlmIHdlIGRvbid0IGRvIHRoaXMpCisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgIC8vIE5PVEU6IHRoaXMgdHJhbnNhY3Rpb24gZG9lcyBub3QgcmVxdWlyZSBhbiBpbnRlcmZhY2UgdG9rZW4KKyAgICByZWdzLT5hc0JpbmRlcigpLT50cmFuc2FjdCgxMDAwLCBkYXRhLCAmcmVwbHkpOworICAgIHJldHVybiAxOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU19DTS9nbC5jcHAgYi9vcGVuZ2wvbGlicy9HTEVTX0NNL2dsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjVjZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYnMvR0xFU19DTS9nbC5jcHAKQEAgLTAsMCArMSwxMTYgQEAKKy8qIAorICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICoqCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkdMRVNfQ00iCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgImhvb2tzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBleHRlbnNpb25zIGZvciB0aGUgZnJhbWV3b3JrCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgZ2xDb2xvclBvaW50ZXJCb3VuZHMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLAorICAgICAgICBjb25zdCBHTHZvaWQgKnB0ciwgR0xzaXplaSBjb3VudCkgeworICAgIGdsQ29sb3JQb2ludGVyKHNpemUsIHR5cGUsIHN0cmlkZSwgcHRyKTsKK30KK3ZvaWQgZ2xOb3JtYWxQb2ludGVyQm91bmRzKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwKKyAgICAgICAgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KSB7CisgICAgZ2xOb3JtYWxQb2ludGVyKHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Cit9Cit2b2lkIGdsVGV4Q29vcmRQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAorICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KSB7CisgICAgZ2xUZXhDb29yZFBvaW50ZXIoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKK30KK3ZvaWQgZ2xWZXJ0ZXhQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAorICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KSB7CisgICAgZ2xWZXJ0ZXhQb2ludGVyKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFjdHVhbCBHTCBlbnRyeS1wb2ludHMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEdMX0xPR0dFUgorIyAgIGluY2x1ZGUgImdsX2xvZ2dlci5oIgorIyAgIGRlZmluZSBHTF9MT0dHRVJfSU1QTChfeCkgX3gKKyNlbHNlCisjICAgZGVmaW5lIEdMX0xPR0dFUl9JTVBMKF94KQorI2VuZGlmCisKKyN1bmRlZiBBUElfRU5UUlkKKyN1bmRlZiBDQUxMX0dMX0FQSQorI3VuZGVmIENBTExfR0xfQVBJX1JFVFVSTgorCisjaWYgVVNFX0ZBU1RfVExTX0tFWQorCisgICAgI2RlZmluZSBBUElfRU5UUlkoX2FwaSkgX19hdHRyaWJ1dGVfXygobmFrZWQpKSBfYXBpCisKKyAgICAjZGVmaW5lIENBTExfR0xfQVBJKF9hcGksIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBhc20gdm9sYXRpbGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIm1vdiAgIHIxMiwgIzB4RkZGRjBGRkYgICBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJsZHIgICByMTIsIFtyMTIsICMtMTVdICAgXG4iICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAibGRyICAgcjEyLCBbcjEyLCAlW3Rsc11dIFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgImNtcCAgIHIxMiwgIzAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJsZHJuZSBwYywgIFtyMTIsICVbYXBpXV0gXG4iICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAiYnggICAgbHIgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDogW3Rsc10gIkoiKFRMU19TTE9UX09QRU5HTF9BUEkqNCksICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIFthcGldICJKIihfX2J1aWx0aW5fb2Zmc2V0b2YoZ2xfaG9va3NfdCwgZ2wuX2FwaSkpICAgIFwKKyAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICApOworICAgIAorICAgICNkZWZpbmUgQ0FMTF9HTF9BUElfUkVUVVJOKF9hcGksIC4uLikgXAorICAgICAgICBDQUxMX0dMX0FQSShfYXBpLCBfX1ZBX0FSR1NfXykgXAorICAgICAgICByZXR1cm4gMDsgLy8gcGxhY2F0ZSBnY2MncyB3YXJuaW5ncy4gbmV2ZXIgcmVhY2hlZC4KKworI2Vsc2UKKworICAgICNkZWZpbmUgQVBJX0VOVFJZKF9hcGkpIF9hcGkKKworICAgICNkZWZpbmUgQ0FMTF9HTF9BUEkoX2FwaSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnbF9ob29rc190OjpnbF90IGNvbnN0ICogY29uc3QgX2MgPSAmZ2V0R2xUaHJlYWRTcGVjaWZpYygpLT5nbDsgXAorICAgICAgICBHTF9MT0dHRVJfSU1QTCggbG9nXyMjX2FwaShfX1ZBX0FSR1NfXyk7ICkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfYy0+X2FwaShfX1ZBX0FSR1NfXykKKyAgICAKKyAgICAjZGVmaW5lIENBTExfR0xfQVBJX1JFVFVSTihfYXBpLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ2xfaG9va3NfdDo6Z2xfdCBjb25zdCAqIGNvbnN0IF9jID0gJmdldEdsVGhyZWFkU3BlY2lmaWMoKS0+Z2w7IFwKKyAgICAgICAgR0xfTE9HR0VSX0lNUEwoIGxvZ18jI19hcGkoX19WQV9BUkdTX18pOyApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIF9jLT5fYXBpKF9fVkFfQVJHU19fKQorCisjZW5kaWYKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAiZ2xfYXBpLmluIgorfQorCisjdW5kZWYgQVBJX0VOVFJZCisjdW5kZWYgQ0FMTF9HTF9BUEkKKyN1bmRlZiBDQUxMX0dMX0FQSV9SRVRVUk4KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU19DTS9nbF9hcGkuaW4gYi9vcGVuZ2wvbGlicy9HTEVTX0NNL2dsX2FwaS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjM0ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYnMvR0xFU19DTS9nbF9hcGkuaW4KQEAgLTAsMCArMSw2MDYgQEAKK3ZvaWQgQVBJX0VOVFJZKGdsQWN0aXZlVGV4dHVyZSkoR0xlbnVtIHRleHR1cmUpIHsKKyAgICBDQUxMX0dMX0FQSShnbEFjdGl2ZVRleHR1cmUsIHRleHR1cmUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEFscGhhRnVuYykoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZikgeworICAgIENBTExfR0xfQVBJKGdsQWxwaGFGdW5jLCBmdW5jLCByZWYpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEFscGhhRnVuY3gpKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpIHsKKyAgICBDQUxMX0dMX0FQSShnbEFscGhhRnVuY3gsIGZ1bmMsIHJlZik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQmluZFRleHR1cmUpKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xCaW5kVGV4dHVyZSwgdGFyZ2V0LCB0ZXh0dXJlKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xCbGVuZEZ1bmMpKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvcikgeworICAgIENBTExfR0xfQVBJKGdsQmxlbmRGdW5jLCBzZmFjdG9yLCBkZmFjdG9yKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGVhcikoR0xiaXRmaWVsZCBtYXNrKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xDbGVhciwgbWFzayk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ2xlYXJDb2xvcikoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENsZWFyQ29sb3IsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGVhckNvbG9yeCkoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENsZWFyQ29sb3J4LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ2xlYXJEZXB0aGYpKEdMY2xhbXBmIGRlcHRoKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xDbGVhckRlcHRoZiwgZGVwdGgpOworfQorCit2b2lkIEFQSV9FTlRSWShnbENsZWFyRGVwdGh4KShHTGNsYW1weCBkZXB0aCkgeworICAgIENBTExfR0xfQVBJKGdsQ2xlYXJEZXB0aHgsIGRlcHRoKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGVhclN0ZW5jaWwpKEdMaW50IHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbENsZWFyU3RlbmNpbCwgcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ2xpZW50QWN0aXZlVGV4dHVyZSkoR0xlbnVtIHRleHR1cmUpIHsKKyAgICBDQUxMX0dMX0FQSShnbENsaWVudEFjdGl2ZVRleHR1cmUsIHRleHR1cmUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbENvbG9yNGYpKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENvbG9yNGYsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDb2xvcjR4KShHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xDb2xvcjR4LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ29sb3JNYXNrKShHTGJvb2xlYW4gciwgR0xib29sZWFuIGcsIEdMYm9vbGVhbiBiLCBHTGJvb2xlYW4gYSkgeworICAgIENBTExfR0xfQVBJKGdsQ29sb3JNYXNrLCByLCBnLCBiLCBhKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDb2xvclBvaW50ZXIpKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwdHIpCit7CisgICAgQ0FMTF9HTF9BUEkoZ2xDb2xvclBvaW50ZXIsIHNpemUsIHR5cGUsIHN0cmlkZSwgcHRyKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCkoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENvbXByZXNzZWRUZXhJbWFnZTJELCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgaW1hZ2VTaXplLCBkYXRhKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCkoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqZGF0YSkgeworICAgIENBTExfR0xfQVBJKGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGltYWdlU2l6ZSwgZGF0YSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ29weVRleEltYWdlMkQpKCAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgYm9yZGVyKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xDb3B5VGV4SW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHgsIHksCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBib3JkZXIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbENvcHlUZXhTdWJJbWFnZTJEKSggICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaGVpZ2h0KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xDb3B5VGV4U3ViSW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgeCwgeSwKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEN1bGxGYWNlKShHTGVudW0gbW9kZSkgeworICAgIENBTExfR0xfQVBJKGdsQ3VsbEZhY2UsIG1vZGUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbERlbGV0ZVRleHR1cmVzKShHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbERlbGV0ZVRleHR1cmVzLCBuLCB0ZXh0dXJlcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRGVwdGhGdW5jKShHTGVudW0gZnVuYykgeworICAgIENBTExfR0xfQVBJKGdsRGVwdGhGdW5jLCBmdW5jKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xEZXB0aE1hc2spKEdMYm9vbGVhbiBmbGFnKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEZXB0aE1hc2ssIGZsYWcpOworfQorCit2b2lkIEFQSV9FTlRSWShnbERlcHRoUmFuZ2VmKShHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcikgeworICAgIENBTExfR0xfQVBJKGdsRGVwdGhSYW5nZWYsIHpOZWFyLCB6RmFyKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xEZXB0aFJhbmdleCkoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpIHsKKyAgICBDQUxMX0dMX0FQSShnbERlcHRoUmFuZ2V4LCB6TmVhciwgekZhcik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRGlzYWJsZSkoR0xlbnVtIGNhcCkgeworICAgIENBTExfR0xfQVBJKGdsRGlzYWJsZSwgY2FwKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xEaXNhYmxlQ2xpZW50U3RhdGUpKEdMZW51bSBhcnJheSkgeworICAgIENBTExfR0xfQVBJKGdsRGlzYWJsZUNsaWVudFN0YXRlLCBhcnJheSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd0FycmF5cykoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEcmF3QXJyYXlzLCBtb2RlLCBmaXJzdCwgY291bnQpOworfQorCit2b2lkIEFQSV9FTlRSWShnbERyYXdFbGVtZW50cykoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsCisgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdFbGVtZW50cywgbW9kZSwgY291bnQsIHR5cGUsIGluZGljZXMpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEVuYWJsZSkoR0xlbnVtIGNhcCkgeworICAgIENBTExfR0xfQVBJKGdsRW5hYmxlLCBjYXApOworfQorCit2b2lkIEFQSV9FTlRSWShnbEVuYWJsZUNsaWVudFN0YXRlKShHTGVudW0gYXJyYXkpIHsKKyAgICBDQUxMX0dMX0FQSShnbEVuYWJsZUNsaWVudFN0YXRlLCBhcnJheSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRmluaXNoKSh2b2lkKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xGaW5pc2gpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEZsdXNoKSh2b2lkKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xGbHVzaCk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRm9nZikoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xGb2dmLCBwbmFtZSwgcGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbEZvZ2Z2KShHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsRm9nZnYsIHBuYW1lLCBwYXJhbXMpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEZvZ3gpKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsRm9neCwgcG5hbWUsIHBhcmFtKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xGb2d4dikoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEZvZ3h2LCBwbmFtZSwgcGFyYW1zKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xGcm9udEZhY2UpKEdMZW51bSBtb2RlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xGcm9udEZhY2UsIG1vZGUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEZydXN0dW1mKShHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsCisgICAgICAgICAgICAgICAgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLAorICAgICAgICAgICAgICAgIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikgeworICAgIENBTExfR0xfQVBJKGdsRnJ1c3R1bWYsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEZydXN0dW14KShHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsCisgICAgICAgICAgICAgICAgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLAorICAgICAgICAgICAgICAgIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikgeworICAgIENBTExfR0xfQVBJKGdsRnJ1c3R1bXgsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEdlblRleHR1cmVzKShHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEdlblRleHR1cmVzLCBuLCB0ZXh0dXJlcyk7Cit9CisKK0dMZW51bSBBUElfRU5UUlkoZ2xHZXRFcnJvcikodm9pZCkgeworICAgIENBTExfR0xfQVBJX1JFVFVSTihnbEdldEVycm9yKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xHZXRJbnRlZ2VydikoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZXRJbnRlZ2VydiwgcG5hbWUsIHBhcmFtcyk7Cit9CisKK2NvbnN0IEdMdWJ5dGUgKiBBUElfRU5UUlkoZ2xHZXRTdHJpbmcpKEdMZW51bSBuYW1lKSB7CisgICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsR2V0U3RyaW5nLCBuYW1lKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xIaW50KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSkgeworICAgIENBTExfR0xfQVBJKGdsSGludCwgdGFyZ2V0LCBtb2RlKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMaWdodE1vZGVsZikoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaWdodE1vZGVsZiwgcG5hbWUsIHBhcmFtKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMaWdodE1vZGVsZnYpKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaWdodE1vZGVsZnYsIHBuYW1lLCBwYXJhbXMpOworfQorCit2b2lkIEFQSV9FTlRSWShnbExpZ2h0TW9kZWx4KShHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKKyAgICBDQUxMX0dMX0FQSShnbExpZ2h0TW9kZWx4LCBwbmFtZSwgcGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbExpZ2h0TW9kZWx4dikoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbExpZ2h0TW9kZWx4diwgcG5hbWUsIHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTGlnaHRmKShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsTGlnaHRmLCBsaWdodCwgcG5hbWUsIHBhcmFtKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMaWdodGZ2KShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaWdodGZ2LCBsaWdodCwgcG5hbWUsIHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTGlnaHR4KShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsTGlnaHR4LCBsaWdodCwgcG5hbWUsIHBhcmFtKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMaWdodHh2KShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaWdodHh2LCBsaWdodCwgcG5hbWUsIHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTGluZVdpZHRoKShHTGZsb2F0IHdpZHRoKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaW5lV2lkdGgsIHdpZHRoKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMaW5lV2lkdGh4KShHTGZpeGVkIHdpZHRoKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaW5lV2lkdGh4LCB3aWR0aCk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTG9hZElkZW50aXR5KSh2b2lkKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMb2FkSWRlbnRpdHkpOworfQorCit2b2lkIEFQSV9FTlRSWShnbExvYWRNYXRyaXhmKShjb25zdCBHTGZsb2F0ICptKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMb2FkTWF0cml4ZiwgbSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTG9hZE1hdHJpeHgpKGNvbnN0IEdMZml4ZWQgKm0pIHsKKyAgICBDQUxMX0dMX0FQSShnbExvYWRNYXRyaXh4LCBtKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMb2dpY09wKShHTGVudW0gb3Bjb2RlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMb2dpY09wLCBvcGNvZGUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbE1hdGVyaWFsZikoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsTWF0ZXJpYWxmLCBmYWNlLCBwbmFtZSwgcGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbE1hdGVyaWFsZnYpKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsTWF0ZXJpYWxmdiwgZmFjZSwgcG5hbWUsIHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTWF0ZXJpYWx4KShHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xNYXRlcmlhbHgsIGZhY2UsIHBuYW1lLCBwYXJhbSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTWF0ZXJpYWx4dikoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xNYXRlcmlhbHh2LCBmYWNlLCBwbmFtZSwgcGFyYW1zKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xNYXRyaXhNb2RlKShHTGVudW0gbW9kZSkgeworICAgIENBTExfR0xfQVBJKGdsTWF0cml4TW9kZSwgbW9kZSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTXVsdE1hdHJpeGYpKGNvbnN0IEdMZmxvYXQgKm0pIHsKKyAgICBDQUxMX0dMX0FQSShnbE11bHRNYXRyaXhmLCBtKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xNdWx0TWF0cml4eCkoY29uc3QgR0xmaXhlZCAqbSkgeworICAgIENBTExfR0xfQVBJKGdsTXVsdE1hdHJpeHgsIG0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbE11bHRpVGV4Q29vcmQ0ZikoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xNdWx0aVRleENvb3JkNGYsIHRhcmdldCwgcywgdCwgciwgcSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTXVsdGlUZXhDb29yZDR4KShHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpIHsKKyAgICBDQUxMX0dMX0FQSShnbE11bHRpVGV4Q29vcmQ0eCwgdGFyZ2V0LCBzLCB0LCByLCBxKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xOb3JtYWwzZikoR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueikgeworICAgIENBTExfR0xfQVBJKGdsTm9ybWFsM2YsIG54LCBueSwgbnopOworfQorCit2b2lkIEFQSV9FTlRSWShnbE5vcm1hbDN4KShHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xOb3JtYWwzeCwgbngsIG55LCBueik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTm9ybWFsUG9pbnRlcikoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKKyAgICBDQUxMX0dMX0FQSShnbE5vcm1hbFBvaW50ZXIsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsT3J0aG9mKSggIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwKKyAgICAgICAgICAgICAgICBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsCisgICAgICAgICAgICAgICAgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xPcnRob2YsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbE9ydGhveCkoICBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsCisgICAgICAgICAgICAgICAgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLAorICAgICAgICAgICAgICAgIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikgeworICAgIENBTExfR0xfQVBJKGdsT3J0aG94LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xQaXhlbFN0b3JlaSkoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsUGl4ZWxTdG9yZWksIHBuYW1lLCBwYXJhbSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsUG9pbnRTaXplKShHTGZsb2F0IHNpemUpIHsKKyAgICBDQUxMX0dMX0FQSShnbFBvaW50U2l6ZSwgc2l6ZSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsUG9pbnRTaXpleCkoR0xmaXhlZCBzaXplKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFNpemV4LCBzaXplKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xQb2x5Z29uT2Zmc2V0KShHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cykgeworICAgIENBTExfR0xfQVBJKGdsUG9seWdvbk9mZnNldCwgZmFjdG9yLCB1bml0cyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsUG9seWdvbk9mZnNldHgpKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2x5Z29uT2Zmc2V0eCwgZmFjdG9yLCB1bml0cyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsUG9wTWF0cml4KSh2b2lkKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb3BNYXRyaXgpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFB1c2hNYXRyaXgpKHZvaWQpIHsKKyAgICBDQUxMX0dMX0FQSShnbFB1c2hNYXRyaXgpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFJlYWRQaXhlbHMpKCAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscykgeworICAgIENBTExfR0xfQVBJKGdsUmVhZFBpeGVscywgeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFJvdGF0ZWYpKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKKyAgICBDQUxMX0dMX0FQSShnbFJvdGF0ZWYsIGFuZ2xlLCB4LCB5LCB6KTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xSb3RhdGV4KShHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xSb3RhdGV4LCBhbmdsZSwgeCwgeSwgeik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsU2FtcGxlQ292ZXJhZ2UpKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTYW1wbGVDb3ZlcmFnZSwgdmFsdWUsIGludmVydCk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsU2FtcGxlQ292ZXJhZ2V4KShHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCkgeworICAgIENBTExfR0xfQVBJKGdsU2FtcGxlQ292ZXJhZ2V4LCB2YWx1ZSwgaW52ZXJ0KTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xTY2FsZWYpKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKKyAgICBDQUxMX0dMX0FQSShnbFNjYWxlZiwgeCwgeSwgeik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsU2NhbGV4KShHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTY2FsZXgsIHgsIHksIHopOworfQorCit2b2lkIEFQSV9FTlRSWShnbFNjaXNzb3IpKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTY2lzc29yLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xTaGFkZU1vZGVsKShHTGVudW0gbW9kZSkgeworICAgIENBTExfR0xfQVBJKGdsU2hhZGVNb2RlbCwgbW9kZSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsU3RlbmNpbEZ1bmMpKEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTdGVuY2lsRnVuYywgZnVuYywgcmVmLCBtYXNrKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xTdGVuY2lsTWFzaykoR0x1aW50IG1hc2spIHsKKyAgICBDQUxMX0dMX0FQSShnbFN0ZW5jaWxNYXNrLCBtYXNrKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xTdGVuY2lsT3ApKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcykgeworICAgIENBTExfR0xfQVBJKGdsU3RlbmNpbE9wLCBmYWlsLCB6ZmFpbCwgenBhc3MpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleENvb3JkUG9pbnRlcikoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikgeworICAgIENBTExfR0xfQVBJKGdsVGV4Q29vcmRQb2ludGVyLCBzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleEVudmYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsVGV4RW52ZiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleEVudmZ2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsVGV4RW52ZnYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVGV4RW52eCkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xUZXhFbnZ4LCB0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVGV4RW52eHYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xUZXhFbnZ4diwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhJbWFnZTJEKSggIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xUZXhJbWFnZTJELCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgIGJvcmRlciwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcmYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyZiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcngpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyeCwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleFN1YkltYWdlMkQpKCAgIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleFN1YkltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVHJhbnNsYXRlZikoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgeworICAgIENBTExfR0xfQVBJKGdsVHJhbnNsYXRlZiwgeCwgeSwgeik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVHJhbnNsYXRleCkoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgeworICAgIENBTExfR0xfQVBJKGdsVHJhbnNsYXRleCwgeCwgeSwgeik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVmVydGV4UG9pbnRlcikoICAgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xWZXJ0ZXhQb2ludGVyLCBzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFZpZXdwb3J0KShHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgeworICAgIENBTExfR0xfQVBJKGdsVmlld3BvcnQsIHgsIHksIHdpZHRoLCBoZWlnaHQpOworfQorCisvLyBFUyAxLjEKK3ZvaWQgQVBJX0VOVFJZKGdsQ2xpcFBsYW5lZikoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbikgeworICAgIENBTExfR0xfQVBJKGdsQ2xpcFBsYW5lZiwgcGxhbmUsIGVxdWF0aW9uKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsQ2xpcFBsYW5leCkoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbikgeworICAgIENBTExfR0xfQVBJKGdsQ2xpcFBsYW5leCwgcGxhbmUsIGVxdWF0aW9uKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsQmluZEJ1ZmZlcikoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcikgeworICAgIENBTExfR0xfQVBJKGdsQmluZEJ1ZmZlciwgdGFyZ2V0LCBidWZmZXIpOworfQordm9pZCBBUElfRU5UUlkoZ2xCdWZmZXJEYXRhKShHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwgR0xlbnVtIHVzYWdlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xCdWZmZXJEYXRhLCB0YXJnZXQsIHNpemUsIGRhdGEsIHVzYWdlKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsQnVmZmVyU3ViRGF0YSkoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSkgeworICAgIENBTExfR0xfQVBJKGdsQnVmZmVyU3ViRGF0YSwgdGFyZ2V0LCBvZmZzZXQsIHNpemUsIGRhdGEpOworfQordm9pZCBBUElfRU5UUlkoZ2xEZWxldGVCdWZmZXJzKShHTHNpemVpIG4sIGNvbnN0IEdMdWludCogYnVmZmVycykgeworICAgIENBTExfR0xfQVBJKGdsRGVsZXRlQnVmZmVycywgbiwgYnVmZmVycyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdlbkJ1ZmZlcnMpKEdMc2l6ZWkgbiwgR0x1aW50KiBidWZmZXJzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZW5CdWZmZXJzLCBuLCBidWZmZXJzKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0Qm9vbGVhbnYpKEdMZW51bSBwbmFtZSwgR0xib29sZWFuICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEdldEJvb2xlYW52LCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0Rml4ZWR2KShHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0Rml4ZWR2LCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0RmxvYXR2KShHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0RmxvYXR2LCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0UG9pbnRlcnYpKEdMZW51bSBwbmFtZSwgdm9pZCAqKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0UG9pbnRlcnYsIHBuYW1lLCBwYXJhbXMpOworfQordm9pZCBBUElfRU5UUlkoZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0Q2xpcFBsYW5lZikoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSkgeworICAgIENBTExfR0xfQVBJKGdsR2V0Q2xpcFBsYW5lZiwgcG5hbWUsIGVxbik7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldENsaXBQbGFuZXgpKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBlcW5bNF0pIHsKKyAgICBDQUxMX0dMX0FQSShnbEdldENsaXBQbGFuZXgsIHBuYW1lLCBlcW4pOworfQordm9pZCBBUElfRU5UUlkoZ2xHZXRMaWdodHh2KShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZXRMaWdodHh2LCBsaWdodCwgcG5hbWUsIHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldExpZ2h0ZnYpKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEdldExpZ2h0ZnYsIGxpZ2h0LCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0TWF0ZXJpYWx4dikoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZXRNYXRlcmlhbHh2LCBmYWNlLCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0TWF0ZXJpYWxmdikoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZXRNYXRlcmlhbGZ2LCBmYWNlLCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4RW52ZnYpKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZXRUZXhFbnZmdiwgZW52LCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4RW52aXYpKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0VGV4RW52aXYsIGVudiwgcG5hbWUsIHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldFRleEVudnh2KShHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0VGV4RW52eHYsIGVudiwgcG5hbWUsIHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldFRleFBhcmFtZXRlcmZ2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0VGV4UGFyYW1ldGVyZnYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldFRleFBhcmFtZXRlcml2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEdldFRleFBhcmFtZXRlcml2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworfQordm9pZCBBUElfRU5UUlkoZ2xHZXRUZXhQYXJhbWV0ZXJ4dikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEdldFRleFBhcmFtZXRlcnh2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworfQorR0xib29sZWFuIEFQSV9FTlRSWShnbElzQnVmZmVyKShHTHVpbnQgYnVmZmVyKSB7CisgICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsSXNCdWZmZXIsIGJ1ZmZlcik7Cit9CitHTGJvb2xlYW4gQVBJX0VOVFJZKGdsSXNFbmFibGVkKShHTGVudW0gY2FwKSB7CisgICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsSXNFbmFibGVkLCBjYXApOworfQorR0xib29sZWFuIEFQSV9FTlRSWShnbElzVGV4dHVyZSkoR0x1aW50IHRleHR1cmUpIHsKKyAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xJc1RleHR1cmUsIHRleHR1cmUpOworfQordm9pZCBBUElfRU5UUlkoZ2xQb2ludFBhcmFtZXRlcmYpKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsUG9pbnRQYXJhbWV0ZXJmLCBwbmFtZSwgcGFyYW0pOworfQordm9pZCBBUElfRU5UUlkoZ2xQb2ludFBhcmFtZXRlcmZ2KShHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsUG9pbnRQYXJhbWV0ZXJmdiwgcG5hbWUsIHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbFBvaW50UGFyYW1ldGVyeCkoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFBhcmFtZXRlcngsIHBuYW1lLCBwYXJhbSk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbFBvaW50UGFyYW1ldGVyeHYpKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFBhcmFtZXRlcnh2LCBwbmFtZSwgcGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsQ29sb3I0dWIpKEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENvbG9yNHViLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbFRleEVudmkpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleEVudmksIHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsVGV4RW52aXYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsVGV4RW52aXYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVGV4UGFyYW1ldGVyZnYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xUZXhQYXJhbWV0ZXJmdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhQYXJhbWV0ZXJpdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xUZXhQYXJhbWV0ZXJpdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhQYXJhbWV0ZXJpKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xUZXhQYXJhbWV0ZXJpLCB0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcnh2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyeHYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbFBvaW50U2l6ZVBvaW50ZXJPRVMpKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFNpemVQb2ludGVyT0VTLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOworfQorCisvLyBFeHRlbnNpb25zCit2b2lkIEFQSV9FTlRSWShnbERyYXdUZXhzT0VTKShHTHNob3J0IHggLCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3LCBHTHNob3J0IGgpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdUZXhzT0VTLCB4LCB5LCB6LCB3LCBoKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleGlPRVMpKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcsIEdMaW50IGgpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdUZXhpT0VTLCB4LCB5LCB6LCB3LCBoKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleGZPRVMpKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdywgR0xmbG9hdCBoKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEcmF3VGV4Zk9FUywgeCwgeSwgeiwgdywgaCk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbERyYXdUZXh4T0VTKShHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6LCBHTGZpeGVkIHcsIEdMZml4ZWQgaCkgeworICAgIENBTExfR0xfQVBJKGdsRHJhd1RleHhPRVMsIHgsIHksIHosIHcsIGgpOworfQordm9pZCBBUElfRU5UUlkoZ2xEcmF3VGV4c3ZPRVMpKGNvbnN0IEdMc2hvcnQqIGNvb3JkcykgeworICAgIENBTExfR0xfQVBJKGdsRHJhd1RleHN2T0VTLCBjb29yZHMpOworfQordm9pZCBBUElfRU5UUlkoZ2xEcmF3VGV4aXZPRVMpKGNvbnN0IEdMaW50KiBjb29yZHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdUZXhpdk9FUywgY29vcmRzKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleGZ2T0VTKShjb25zdCBHTGZsb2F0KiBjb29yZHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdUZXhmdk9FUywgY29vcmRzKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleHh2T0VTKShjb25zdCBHTGZpeGVkKiBjb29yZHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdUZXh4dk9FUywgY29vcmRzKTsKK30KK0dMYml0ZmllbGQgQVBJX0VOVFJZKGdsUXVlcnlNYXRyaXh4T0VTKShHTGZpeGVkKiBtYW50aXNzYSwgR0xpbnQqIGV4cG9uZW50KSB7CisgICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsUXVlcnlNYXRyaXh4T0VTLCBtYW50aXNzYSwgZXhwb25lbnQpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU19DTS9nbF9sb2dnZXIuY3BwIGIvb3BlbmdsL2xpYnMvR0xFU19DTS9nbF9sb2dnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YmU1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGlicy9HTEVTX0NNL2dsX2xvZ2dlci5jcHAKQEAgLTAsMCArMSwxMDYwIEBACisvKgorICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKioKKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJHTExvZ2dlciIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJnbF9sb2dnZXIuaCIKKworI3VuZGVmIE5FTEVNCisjZGVmaW5lIE5FTEVNKHgpIChzaXplb2YoeCkvc2l6ZW9mKCooeCkpKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW50IGJpbmFyeVNlYXJjaChUIGNvbnN0IHNvcnRlZEFycmF5W10sIGludCBmaXJzdCwgaW50IGxhc3QsIEVHTGludCBrZXkpCit7CisgICB3aGlsZSAoZmlyc3QgPD0gbGFzdCkgeworICAgICAgIGludCBtaWQgPSAoZmlyc3QgKyBsYXN0KSAvIDI7CisgICAgICAgaWYgKGtleSA+IHNvcnRlZEFycmF5W21pZF0ua2V5KSB7CisgICAgICAgICAgIGZpcnN0ID0gbWlkICsgMTsKKyAgICAgICB9IGVsc2UgaWYgKGtleSA8IHNvcnRlZEFycmF5W21pZF0ua2V5KSB7CisgICAgICAgICAgIGxhc3QgPSBtaWQgLSAxOworICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIHJldHVybiBtaWQ7CisgICAgICAgfQorICAgfQorICAgcmV0dXJuIC0xOworfQorCitzdHJ1Y3QgcGFpcl90IHsKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIGludCAgICAgICAgIGtleTsKK307CisKK3N0YXRpYyBjb25zdCBwYWlyX3QgZ0VudW1NYXBbXSA9IHsKKyAgICAjZGVmaW5lIEdMRU5VTShOQU1FLCBWQUxVRSkgeyAjTkFNRSwgVkFMVUUgfSwKKyAgICAjaW5jbHVkZSAiZ2xfZW51bXMuaW4iCisgICAgI3VuZGVmIEdMRU5VTQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFPgorY2xhc3MgR0xMb2dWYWx1ZSB7CitwdWJsaWM6CisgICAgR0xMb2dWYWx1ZShUWVBFIHZhbHVlKSA6IG1WYWx1ZSh2YWx1ZSkgeyB9CisgICAgY29uc3QgVFlQRSYgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBtVmFsdWU7IH0KKyAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICByZXR1cm4gY29udmVydFRvU3RyaW5nKG1WYWx1ZSk7CisgICAgfQorcHJpdmF0ZToKKyAgICBjb25zdCBUWVBFJiBtVmFsdWU7CisgICAgU3RyaW5nOCBjb252ZXJ0VG9TdHJpbmcodW5zaWduZWQgaW50IHYpIGNvbnN0IHsKKyAgICAgICAgY2hhciBidWZbMTZdOworICAgICAgICBzbnByaW50ZihidWYsIDE2LCAiJXUiLCB2KTsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoYnVmKTsKKyAgICB9CisgICAgU3RyaW5nOCBjb252ZXJ0VG9TdHJpbmcodW5zaWduZWQgbG9uZyB2KSBjb25zdCB7CisgICAgICAgIGNoYXIgYnVmWzE2XTsKKyAgICAgICAgc25wcmludGYoYnVmLCAxNiwgIiVsdSIsIHYpOworICAgICAgICByZXR1cm4gU3RyaW5nOChidWYpOworICAgIH0KKyAgICBTdHJpbmc4IGNvbnZlcnRUb1N0cmluZyhpbnQgdikgY29uc3QgeworICAgICAgICBjaGFyIGJ1ZlsxNl07CisgICAgICAgIHNucHJpbnRmKGJ1ZiwgMTYsICIlZCIsIHYpOworICAgICAgICByZXR1cm4gU3RyaW5nOChidWYpOworICAgIH0KKyAgICBTdHJpbmc4IGNvbnZlcnRUb1N0cmluZyhsb25nIHYpIGNvbnN0IHsKKyAgICAgICAgY2hhciBidWZbMTZdOworICAgICAgICBzbnByaW50ZihidWYsIDE2LCAiJWxkIiwgdik7CisgICAgICAgIHJldHVybiBTdHJpbmc4KGJ1Zik7CisgICAgfQorICAgIFN0cmluZzggY29udmVydFRvU3RyaW5nKGZsb2F0IHYpIGNvbnN0IHsKKyAgICAgICAgY2hhciBidWZbMTZdOworICAgICAgICBzbnByaW50ZihidWYsIDE2LCAiJWYiLCB2KTsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoYnVmKTsKKyAgICB9CisgICAgU3RyaW5nOCBjb252ZXJ0VG9TdHJpbmcodm9pZCBjb25zdCogdikgY29uc3QgeworICAgICAgICBjaGFyIGJ1ZlsxNl07CisgICAgICAgIHNucHJpbnRmKGJ1ZiwgMTYsICIlcCIsIHYpOworICAgICAgICByZXR1cm4gU3RyaW5nOChidWYpOworICAgIH0KK307CisKK2NsYXNzIEdMTG9nRW51bSA6IHB1YmxpYyBHTExvZ1ZhbHVlPEdMZW51bT4geworcHVibGljOgorICAgIEdMTG9nRW51bShHTGVudW0gdikgOiBHTExvZ1ZhbHVlPEdMZW51bT4odikgeyB9CisgICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgR0xlbnVtIHYgPSBnZXRWYWx1ZSgpOworICAgICAgICBpbnQgaSA9IGJpbmFyeVNlYXJjaDxwYWlyX3Q+KGdFbnVtTWFwLCAwLCBORUxFTShnRW51bU1hcCktMSwgdik7CisgICAgICAgIGlmIChpID49IDApIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmc4KGdFbnVtTWFwW2ldLm5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciBidWZbMTZdOworICAgICAgICAgICAgc25wcmludGYoYnVmLCAxNiwgIjB4JTA0eCIsIHYpOworICAgICAgICAgICAgcmV0dXJuIFN0cmluZzgoYnVmKTsKKyAgICAgICAgfQorICAgIH0KK307CisKK2NsYXNzIEdMTG9nQ2xlYXJCaXRmaWVsZCA6IHB1YmxpYyBHTExvZ1ZhbHVlPEdMYml0ZmllbGQ+IHsKK3B1YmxpYzoKKyAgICBHTExvZ0NsZWFyQml0ZmllbGQoR0xiaXRmaWVsZCB2KSA6IEdMTG9nVmFsdWU8R0xiaXRmaWVsZD4odikgeyB9CisgICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgY2hhciBidWZbMTZdOworICAgICAgICBzbnByaW50ZihidWYsIDE2LCAiMHglMDh4IiwgZ2V0VmFsdWUoKSk7CisgICAgICAgIHJldHVybiBTdHJpbmc4KGJ1Zik7CisgICAgfQorfTsKKworY2xhc3MgR0xMb2dCb29sIDogcHVibGljIEdMTG9nVmFsdWU8R0xib29sZWFuPiB7CitwdWJsaWM6CisgICAgR0xMb2dCb29sKEdMYm9vbGVhbiB2KSA6IEdMTG9nVmFsdWU8R0xib29sZWFuPih2KSB7IH0KKyAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICBHTGJvb2xlYW4gdiA9IGdldFZhbHVlKCk7CisgICAgICAgIGlmICh2ID09IEdMX1RSVUUpICAgcmV0dXJuIFN0cmluZzgoIkdMX1RSVUUiKTsKKyAgICAgICAgaWYgKHYgPT0gR0xfRkFMU0UpICByZXR1cm4gU3RyaW5nOCgiR0xfRkFMU0UiKTsKKyAgICAgICAgcmV0dXJuIEdMTG9nVmFsdWU8R0xib29sZWFuPjo6dG9TdHJpbmcoKTsKKyAgICB9Cit9OworCitjbGFzcyBHTExvZ0ZpeGVkIDogcHVibGljIEdMTG9nVmFsdWU8R0xmaXhlZD4geworcHVibGljOgorICAgIEdMTG9nRml4ZWQoR0xmaXhlZCB2KSA6IEdMTG9nVmFsdWU8R0xmaXhlZD4odikgeyB9CisgICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgY2hhciBidWZbMTZdOworICAgICAgICBzbnByaW50ZihidWYsIDE2LCAiMHglMDh4IiwgZ2V0VmFsdWUoKSk7CisgICAgICAgIHJldHVybiBTdHJpbmc4KGJ1Zik7CisgICAgfQorfTsKKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4KK2NsYXNzIEdMTG9nQnVmZmVyIDogcHVibGljIEdMTG9nVmFsdWU8VFlQRSAqPiB7CitwdWJsaWM6CisgICAgR0xMb2dCdWZmZXIoVFlQRSogYnVmZmVyLCBzaXplX3QgY291bnQgPSAtMSkKKyAgICAgICAgOiBHTExvZ1ZhbHVlPFRZUEUqPihidWZmZXIpCisgICAgeyAvLyBvdXRwdXQgYnVmZmVyCisgICAgfQorICAgIEdMTG9nQnVmZmVyKFRZUEUgY29uc3QqIGJ1ZmZlciwgc2l6ZV90IGNvdW50ID0gLTEpCisgICAgOiBHTExvZ1ZhbHVlPFRZUEUqPihjb25zdF9jYXN0PFRZUEUqPihidWZmZXIpKQorICAgIHsgLy8gaW5wdXQgYnVmZmVyCisgICAgfQorfTsKKworY2xhc3MgR0xMb2cKK3sKK3B1YmxpYzoKKyAgICBHTExvZyhjb25zdCBjaGFyKiBuYW1lKSA6IG1OdW1QYXJhbXMoMCkgeworICAgICAgICBtU3RyaW5nLmFwcGVuZChuYW1lKTsKKyAgICAgICAgbVN0cmluZy5hcHBlbmQoIigiKTsKKyAgICB9CisKKyAgICB+R0xMb2coKSB7CisgICAgICAgIExPR0QoIiVzKTsiLCBtU3RyaW5nLnN0cmluZygpKTsKKyAgICB9CisKKyAgICBHTExvZyYgb3BlcmF0b3IgPDwgKHVuc2lnbmVkIGNoYXIgdikgeworICAgICAgICByZXR1cm4gKnRoaXMgPDwgR0xMb2dWYWx1ZTx1bnNpZ25lZCBpbnQ+KHYpOworICAgIH0KKyAgICBHTExvZyYgb3BlcmF0b3IgPDwgKHNob3J0IHYpIHsKKyAgICAgICAgcmV0dXJuICp0aGlzIDw8IEdMTG9nVmFsdWU8dW5zaWduZWQgaW50Pih2KTsKKyAgICB9CisgICAgR0xMb2cmIG9wZXJhdG9yIDw8ICh1bnNpZ25lZCBpbnQgdikgeworICAgICAgICByZXR1cm4gKnRoaXMgPDwgR0xMb2dWYWx1ZTx1bnNpZ25lZCBpbnQ+KHYpOworICAgIH0KKyAgICBHTExvZyYgb3BlcmF0b3IgPDwgKGludCB2KSB7CisgICAgICAgIHJldHVybiAqdGhpcyA8PCBHTExvZ1ZhbHVlPGludD4odik7CisgICAgfQorICAgIEdMTG9nJiBvcGVyYXRvciA8PCAobG9uZyB2KSB7CisgICAgICAgIHJldHVybiAqdGhpcyA8PCBHTExvZ1ZhbHVlPGxvbmc+KHYpOworICAgIH0KKyAgICBHTExvZyYgb3BlcmF0b3IgPDwgKHVuc2lnbmVkIGxvbmcgdikgeworICAgICAgICByZXR1cm4gKnRoaXMgPDwgR0xMb2dWYWx1ZTx1bnNpZ25lZCBsb25nPih2KTsKKyAgICB9CisgICAgR0xMb2cmIG9wZXJhdG9yIDw8IChmbG9hdCB2KSB7CisgICAgICAgIHJldHVybiAqdGhpcyA8PCBHTExvZ1ZhbHVlPGZsb2F0Pih2KTsKKyAgICB9CisgICAgR0xMb2cmIG9wZXJhdG9yIDw8IChjb25zdCB2b2lkKiB2KSB7CisgICAgICAgIHJldHVybiAqdGhpcyA8PCBHTExvZ1ZhbHVlPGNvbnN0IHZvaWQqID4odik7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+CisgICAgR0xMb2cmIG9wZXJhdG9yIDw8IChjb25zdCBUWVBFJiByaHMpIHsKKyAgICAgICAgaWYgKG1OdW1QYXJhbXMgPiAwKQorICAgICAgICAgICAgbVN0cmluZy5hcHBlbmQoIiwgIik7CisgICAgICAgIG1TdHJpbmcuYXBwZW5kKHJocy50b1N0cmluZygpKTsKKyAgICAgICAgbU51bVBhcmFtcysrOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgY29uc3QgU3RyaW5nOCYgc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gbVN0cmluZzsgfQorcHJpdmF0ZToKKyAgICBHTExvZyhjb25zdCBHTExvZyYpOworCisgICAgU3RyaW5nOCBtU3RyaW5nOworICAgIGludCBtTnVtUGFyYW1zOworfTsKKworI2RlZmluZSBBUElfRU5UUlkoYXBpKSAgICAgICAgICAgICAgICAgICAgICBsb2dfIyNhcGkKKyNkZWZpbmUgQ0FMTF9HTF9BUEkoX3gsIC4uLikKKyNkZWZpbmUgQ0FMTF9HTF9BUElfUkVUVVJOKF94LCAuLi4pICAgICAgICAgcmV0dXJuKDApOworCit2b2lkIEFQSV9FTlRSWShnbEFjdGl2ZVRleHR1cmUpKEdMZW51bSB0ZXh0dXJlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xBY3RpdmVUZXh0dXJlLCB0ZXh0dXJlKTsKKyAgICBHTExvZygiZ2xBY3RpdmVUZXh0dXJlIikgPDwgR0xMb2dFbnVtKHRleHR1cmUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEFscGhhRnVuYykoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZikgeworICAgIENBTExfR0xfQVBJKGdsQWxwaGFGdW5jLCBmdW5jLCByZWYpOworICAgIEdMTG9nKCJnbEFscGhhRnVuYyIpIDw8IEdMTG9nRW51bShmdW5jKSA8PCByZWY7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQWxwaGFGdW5jeCkoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZikgeworICAgIENBTExfR0xfQVBJKGdsQWxwaGFGdW5jeCwgZnVuYywgcmVmKTsKKyAgICBHTExvZygiZ2xBbHBoYUZ1bmN4IikgPDwgR0xMb2dFbnVtKGZ1bmMpIDw8IEdMTG9nRml4ZWQocmVmKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xCaW5kVGV4dHVyZSkoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpIHsKKyAgICBDQUxMX0dMX0FQSShnbEJpbmRUZXh0dXJlLCB0YXJnZXQsIHRleHR1cmUpOworICAgIEdMTG9nKCJnbEJpbmRUZXh0dXJlIikgPDwgR0xMb2dFbnVtKHRhcmdldCkgPDwgdGV4dHVyZTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xCbGVuZEZ1bmMpKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvcikgeworICAgIENBTExfR0xfQVBJKGdsQmxlbmRGdW5jLCBzZmFjdG9yLCBkZmFjdG9yKTsKKyAgICBHTExvZygiZ2xCbGVuZEZ1bmMiKSA8PCBHTExvZ0VudW0oc2ZhY3RvcikgPDwgR0xMb2dFbnVtKGRmYWN0b3IpOworfQorCit2b2lkIEFQSV9FTlRSWShnbENsZWFyKShHTGJpdGZpZWxkIG1hc2spIHsKKyAgICBDQUxMX0dMX0FQSShnbENsZWFyLCBtYXNrKTsKKyAgICBHTExvZygiZ2xDbGVhciIpIDw8IEdMTG9nQ2xlYXJCaXRmaWVsZChtYXNrKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGVhckNvbG9yKShHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSkgeworICAgIENBTExfR0xfQVBJKGdsQ2xlYXJDb2xvciwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgIEdMTG9nKCJnbENsZWFyQ29sb3IiKSA8PCByZWQgPDwgZ3JlZW4gPDwgYmx1ZSA8PCBhbHBoYTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGVhckNvbG9yeCkoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENsZWFyQ29sb3J4LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgR0xMb2coImdsQ2xlYXJDb2xvcngiKSA8PCBHTExvZ0ZpeGVkKHJlZCkgPDwgR0xMb2dGaXhlZChncmVlbikgPDwgR0xMb2dGaXhlZChibHVlKSA8PCBHTExvZ0ZpeGVkKGFscGhhKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGVhckRlcHRoZikoR0xjbGFtcGYgZGVwdGgpIHsKKyAgICBDQUxMX0dMX0FQSShnbENsZWFyRGVwdGhmLCBkZXB0aCk7CisgICAgR0xMb2coImdsQ2xlYXJEZXB0aGYiKSA8PCBkZXB0aDsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGVhckRlcHRoeCkoR0xjbGFtcHggZGVwdGgpIHsKKyAgICBDQUxMX0dMX0FQSShnbENsZWFyRGVwdGh4LCBkZXB0aCk7CisgICAgR0xMb2coImdsQ2xlYXJEZXB0aHgiKSA8PCBHTExvZ0ZpeGVkKGRlcHRoKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGVhclN0ZW5jaWwpKEdMaW50IHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbENsZWFyU3RlbmNpbCwgcyk7CisgICAgR0xMb2coImdsQ2xlYXJTdGVuY2lsIikgPDwgczsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDbGllbnRBY3RpdmVUZXh0dXJlKShHTGVudW0gdGV4dHVyZSkgeworICAgIENBTExfR0xfQVBJKGdsQ2xpZW50QWN0aXZlVGV4dHVyZSwgdGV4dHVyZSk7CisgICAgR0xMb2coImdsQ2xpZW50QWN0aXZlVGV4dHVyZSIpIDw8IEdMTG9nRW51bSh0ZXh0dXJlKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDb2xvcjRmKShHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xDb2xvcjRmLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgR0xMb2coImdsQ29sb3I0ZiIpIDw8IHJlZCA8PCBncmVlbiA8PCBibHVlIDw8IGFscGhhOworfQorCit2b2lkIEFQSV9FTlRSWShnbENvbG9yNHgpKEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENvbG9yNHgsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICBHTExvZygiZ2xDb2xvcjR4IikgPDwgR0xMb2dGaXhlZChyZWQpIDw8IEdMTG9nRml4ZWQoZ3JlZW4pIDw8IEdMTG9nRml4ZWQoYmx1ZSkgPDwgR0xMb2dGaXhlZChhbHBoYSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ29sb3JNYXNrKShHTGJvb2xlYW4gciwgR0xib29sZWFuIGcsIEdMYm9vbGVhbiBiLCBHTGJvb2xlYW4gYSkgeworICAgIENBTExfR0xfQVBJKGdsQ29sb3JNYXNrLCByLCBnLCBiLCBhKTsKKyAgICBHTExvZygiZ2xDb2xvck1hc2siKSA8PCBHTExvZ0Jvb2wocikgPDwgR0xMb2dCb29sKGcpIDw8IEdMTG9nQm9vbChiKSA8PCBHTExvZ0Jvb2woYSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ29sb3JQb2ludGVyKShHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcHRyKQoreworICAgIENBTExfR0xfQVBJKGdsQ29sb3JQb2ludGVyLCBzaXplLCB0eXBlLCBzdHJpZGUsIHB0cik7CisgICAgR0xMb2coImdsQ29sb3JQb2ludGVyIikgPDwgc2l6ZSA8PCBHTExvZ0VudW0odHlwZSkgPDwgc3RyaWRlIDw8IHB0cjsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCkoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENvbXByZXNzZWRUZXhJbWFnZTJELCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgaW1hZ2VTaXplLCBkYXRhKTsKKyAgICBHTExvZygiZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCIpCisgICAgICAgICAgICAgICAgPDwgR0xMb2dFbnVtKHRhcmdldCkgPDwgbGV2ZWwgPDwgR0xMb2dFbnVtKGludGVybmFsZm9ybWF0KQorICAgICAgICAgICAgICAgIDw8IHdpZHRoIDw8IGhlaWdodCA8PCBib3JkZXIgPDwgaW1hZ2VTaXplIDw8IGRhdGE7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQpKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKmRhdGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJELCB0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LAorICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBpbWFnZVNpemUsIGRhdGEpOworICAgIEdMTG9nKCJnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEIikKKyAgICAgICAgICAgIDw8IEdMTG9nRW51bSh0YXJnZXQpIDw8IGxldmVsIDw8IHhvZmZzZXQgPDwgeW9mZnNldAorICAgICAgICAgICAgPDwgd2lkdGggPDwgaGVpZ2h0IDw8IEdMTG9nRW51bShmb3JtYXQpIDw8IGltYWdlU2l6ZSA8PCBkYXRhOworfQorCit2b2lkIEFQSV9FTlRSWShnbENvcHlUZXhJbWFnZTJEKSggIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGJvcmRlcikgeworICAgIENBTExfR0xfQVBJKGdsQ29weVRleEltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5LAorICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgYm9yZGVyKTsKKyAgICBHTExvZygiZ2xDb3B5VGV4SW1hZ2UyRCIpCisgICAgICAgICAgICA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBsZXZlbCA8PCBHTExvZ0VudW0oaW50ZXJuYWxmb3JtYXQpCisgICAgICAgICAgICA8PCB4IDw8IHkgPDwgd2lkdGggPDwgaGVpZ2h0IDw8IGJvcmRlcjsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xDb3B5VGV4U3ViSW1hZ2UyRCkoICAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIGhlaWdodCkgeworICAgIENBTExfR0xfQVBJKGdsQ29weVRleFN1YkltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHgsIHksCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKKyAgICBHTExvZygiZ2xDb3B5VGV4U3ViSW1hZ2UyRCIpCisgICAgICAgICAgICA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBsZXZlbCA8PCB4b2Zmc2V0IDw8IHlvZmZzZXQKKyAgICAgICAgICAgIDw8IHggPDwgeSA8PCB3aWR0aCA8PCBoZWlnaHQ7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsQ3VsbEZhY2UpKEdMZW51bSBtb2RlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xDdWxsRmFjZSwgbW9kZSk7CisgICAgR0xMb2coImdsQ3VsbEZhY2UiKSA8PCBHTExvZ0VudW0obW9kZSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRGVsZXRlVGV4dHVyZXMpKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcykgeworICAgIENBTExfR0xfQVBJKGdsRGVsZXRlVGV4dHVyZXMsIG4sIHRleHR1cmVzKTsKKyAgICBHTExvZygiZ2xEZWxldGVUZXh0dXJlcyIpIDw8IG4gPDwgR0xMb2dCdWZmZXI8R0x1aW50Pih0ZXh0dXJlcywgbik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRGVwdGhGdW5jKShHTGVudW0gZnVuYykgeworICAgIENBTExfR0xfQVBJKGdsRGVwdGhGdW5jLCBmdW5jKTsKKyAgICBHTExvZygiZ2xEZXB0aEZ1bmMiKSA8PCBHTExvZ0VudW0oZnVuYyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRGVwdGhNYXNrKShHTGJvb2xlYW4gZmxhZykgeworICAgIENBTExfR0xfQVBJKGdsRGVwdGhNYXNrLCBmbGFnKTsKKyAgICBHTExvZygiZ2xEZXB0aE1hc2siKSA8PCBHTExvZ0Jvb2woZmxhZyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRGVwdGhSYW5nZWYpKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEZXB0aFJhbmdlZiwgek5lYXIsIHpGYXIpOworICAgIEdMTG9nKCJnbERlcHRoUmFuZ2VmIikgPDwgek5lYXIgPDwgekZhcjsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xEZXB0aFJhbmdleCkoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpIHsKKyAgICBDQUxMX0dMX0FQSShnbERlcHRoUmFuZ2V4LCB6TmVhciwgekZhcik7CisgICAgR0xMb2coImdsRGVwdGhSYW5nZXgiKSA8PCBHTExvZ0ZpeGVkKHpOZWFyKSA8PCBHTExvZ0ZpeGVkKHpGYXIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbERpc2FibGUpKEdMZW51bSBjYXApIHsKKyAgICBDQUxMX0dMX0FQSShnbERpc2FibGUsIGNhcCk7CisgICAgR0xMb2coImdsRGlzYWJsZSIpIDw8IEdMTG9nRW51bShjYXApOworfQorCit2b2lkIEFQSV9FTlRSWShnbERpc2FibGVDbGllbnRTdGF0ZSkoR0xlbnVtIGFycmF5KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEaXNhYmxlQ2xpZW50U3RhdGUsIGFycmF5KTsKKyAgICBHTExvZygiZ2xEaXNhYmxlQ2xpZW50U3RhdGUiKSA8PCBHTExvZ0VudW0oYXJyYXkpOworfQorCit2b2lkIEFQSV9FTlRSWShnbERyYXdBcnJheXMpKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkgeworICAgIENBTExfR0xfQVBJKGdsRHJhd0FycmF5cywgbW9kZSwgZmlyc3QsIGNvdW50KTsKKyAgICBHTExvZygiZ2xEcmF3QXJyYXlzIikgPDwgR0xMb2dFbnVtKG1vZGUpIDw8IGZpcnN0IDw8IGNvdW50OworfQorCit2b2lkIEFQSV9FTlRSWShnbERyYXdFbGVtZW50cykoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsCisgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdFbGVtZW50cywgbW9kZSwgY291bnQsIHR5cGUsIGluZGljZXMpOworICAgIEdMTG9nIGxvZygiZ2xEcmF3RWxlbWVudHMiKTsKKyAgICBsb2cgPDwgR0xMb2dFbnVtKG1vZGUpIDw8IGNvdW50IDw8IEdMTG9nRW51bSh0eXBlKTsKKyAgICBpZiAodHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKSB7CisgICAgICAgIGxvZyA8PCBHTExvZ0J1ZmZlcjxHTHVieXRlPihzdGF0aWNfY2FzdDxjb25zdCBHTHVieXRlKj4oaW5kaWNlcyksIGNvdW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBsb2cgPDwgR0xMb2dCdWZmZXI8R0x1c2hvcnQ+KHN0YXRpY19jYXN0PGNvbnN0IEdMdXNob3J0Kj4oaW5kaWNlcyksIGNvdW50KTsKKyAgICB9CisgICAgbG9nOworfQorCit2b2lkIEFQSV9FTlRSWShnbEVuYWJsZSkoR0xlbnVtIGNhcCkgeworICAgIENBTExfR0xfQVBJKGdsRW5hYmxlLCBjYXApOworICAgIEdMTG9nKCJnbEVuYWJsZSIpIDw8IEdMTG9nRW51bShjYXApOworfQorCit2b2lkIEFQSV9FTlRSWShnbEVuYWJsZUNsaWVudFN0YXRlKShHTGVudW0gYXJyYXkpIHsKKyAgICBDQUxMX0dMX0FQSShnbEVuYWJsZUNsaWVudFN0YXRlLCBhcnJheSk7CisgICAgR0xMb2coImdsRW5hYmxlQ2xpZW50U3RhdGUiKSA8PCBHTExvZ0VudW0oYXJyYXkpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEZpbmlzaCkodm9pZCkgeworICAgIENBTExfR0xfQVBJKGdsRmluaXNoKTsKKyAgICBHTExvZygiZ2xGaW5pc2giKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xGbHVzaCkodm9pZCkgeworICAgIENBTExfR0xfQVBJKGdsRmx1c2gpOworICAgIEdMTG9nKCJnbEZsdXNoIik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRm9nZikoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xGb2dmLCBwbmFtZSwgcGFyYW0pOworICAgIEdMTG9nKCJnbEZvZ2YiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IHBhcmFtOworfQorCit2b2lkIEFQSV9FTlRSWShnbEZvZ2Z2KShHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsRm9nZnYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsRm9nZnYiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZmxvYXQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRm9neCkoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xGb2d4LCBwbmFtZSwgcGFyYW0pOworICAgIEdMTG9nKCJnbEZvZ3giKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nRml4ZWQocGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbEZvZ3h2KShHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsRm9neHYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsRm9nZngiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRnJvbnRGYWNlKShHTGVudW0gbW9kZSkgeworICAgIENBTExfR0xfQVBJKGdsRnJvbnRGYWNlLCBtb2RlKTsKKyAgICBHTExvZygiZ2xGcm9udEZhY2UiKSA8PCBHTExvZ0VudW0obW9kZSk7CisgfQorCit2b2lkIEFQSV9FTlRSWShnbEZydXN0dW1mKShHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsCisgICAgICAgICAgICAgICAgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLAorICAgICAgICAgICAgICAgIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikgeworICAgIENBTExfR0xfQVBJKGdsRnJ1c3R1bWYsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOworICAgIEdMTG9nKCJnbEZydXN0dW1mIikgPDwgbGVmdCA8PCByaWdodCA8PCBib3R0b20gPDwgdG9wIDw8IHpOZWFyIDw8IHpGYXI7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsRnJ1c3R1bXgpKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwKKyAgICAgICAgICAgICAgICBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsCisgICAgICAgICAgICAgICAgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xGcnVzdHVteCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcik7CisgICAgR0xMb2coImdsRnJ1c3R1bXgiKQorICAgICAgICAgICAgPDwgR0xMb2dGaXhlZChsZWZ0KSA8PCBHTExvZ0ZpeGVkKHJpZ2h0KQorICAgICAgICAgICAgPDwgR0xMb2dGaXhlZChib3R0b20pIDw8IEdMTG9nRml4ZWQodG9wKQorICAgICAgICAgICAgPDwgR0xMb2dGaXhlZCh6TmVhcikgPDwgR0xMb2dGaXhlZCh6RmFyKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xHZW5UZXh0dXJlcykoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZW5UZXh0dXJlcywgbiwgdGV4dHVyZXMpOworICAgIEdMTG9nKCJnbEdlblRleHR1cmVzIikgPDwgbiA8PCBHTExvZ0J1ZmZlcjxHTHVpbnQ+KHRleHR1cmVzLCBuKTsKK30KKworR0xlbnVtIEFQSV9FTlRSWShnbEdldEVycm9yKSh2b2lkKSB7CisgICAgR0xMb2coImdsR2V0RXJyb3IiKTsKKyAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xHZXRFcnJvcik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsR2V0SW50ZWdlcnYpKEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0SW50ZWdlcnYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsR2V0SW50ZWdlcnYiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMaW50PihwYXJhbXMpOworfQorCitjb25zdCBHTHVieXRlICogQVBJX0VOVFJZKGdsR2V0U3RyaW5nKShHTGVudW0gbmFtZSkgeworICAgIEdMTG9nKCJnbEdldFN0cmluZyIpIDw8IEdMTG9nRW51bShuYW1lKTsKKyAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xHZXRTdHJpbmcsIG5hbWUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbEhpbnQpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xIaW50LCB0YXJnZXQsIG1vZGUpOworICAgIEdMTG9nKCJHTGVudW0iKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBHTExvZ0VudW0obW9kZSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTGlnaHRNb2RlbGYpKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsTGlnaHRNb2RlbGYsIHBuYW1lLCBwYXJhbSk7CisgICAgR0xMb2coImdsTGlnaHRNb2RlbGYiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IHBhcmFtOworfQorCit2b2lkIEFQSV9FTlRSWShnbExpZ2h0TW9kZWxmdikoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbExpZ2h0TW9kZWxmdiwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xMaWdodE1vZGVsZnYiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZmxvYXQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTGlnaHRNb2RlbHgpKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsTGlnaHRNb2RlbHgsIHBuYW1lLCBwYXJhbSk7CisgICAgR0xMb2coImdsTGlnaHRNb2RlbHgiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nRml4ZWQocGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbExpZ2h0TW9kZWx4dikoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbExpZ2h0TW9kZWx4diwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xMaWdodE1vZGVseHYiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTGlnaHRmKShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsTGlnaHRmLCBsaWdodCwgcG5hbWUsIHBhcmFtKTsKKyAgICBHTExvZygiZ2xMaWdodGYiKSA8PCBHTExvZ0VudW0obGlnaHQpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgcGFyYW07Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTGlnaHRmdikoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsTGlnaHRmdiwgbGlnaHQsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsTGlnaHRmdiIpIDw8IEdMTG9nRW51bShsaWdodCkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0J1ZmZlcjxHTGZsb2F0PihwYXJhbXMpOworfQorCit2b2lkIEFQSV9FTlRSWShnbExpZ2h0eCkoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKKyAgIENBTExfR0xfQVBJKGdsTGlnaHR4LCBsaWdodCwgcG5hbWUsIHBhcmFtKTsKKyAgIEdMTG9nKCJnbExpZ2h0eCIpIDw8IEdMTG9nRW51bShsaWdodCkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0ZpeGVkKHBhcmFtKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMaWdodHh2KShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaWdodHh2LCBsaWdodCwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xMaWdodHh2IikgPDwgR0xMb2dFbnVtKGxpZ2h0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTGluZVdpZHRoKShHTGZsb2F0IHdpZHRoKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaW5lV2lkdGgsIHdpZHRoKTsKKyAgICBHTExvZygiZ2xMaW5lV2lkdGgiKSA8PCB3aWR0aDsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMaW5lV2lkdGh4KShHTGZpeGVkIHdpZHRoKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMaW5lV2lkdGh4LCB3aWR0aCk7CisgICAgR0xMb2coImdsTGluZVdpZHRoIikgPDwgR0xMb2dGaXhlZCh3aWR0aCk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTG9hZElkZW50aXR5KSh2b2lkKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMb2FkSWRlbnRpdHkpOworICAgIEdMTG9nKCJnbExvYWRJZGVudGl0eSIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbExvYWRNYXRyaXhmKShjb25zdCBHTGZsb2F0ICptKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMb2FkTWF0cml4ZiwgbSk7CisgICAgR0xMb2coImdsTG9hZE1hdHJpeGYiKSA8PCBHTExvZ0J1ZmZlcjxHTGZsb2F0PihtLCAxNik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTG9hZE1hdHJpeHgpKGNvbnN0IEdMZml4ZWQgKm0pIHsKKyAgICBDQUxMX0dMX0FQSShnbExvYWRNYXRyaXh4LCBtKTsKKyAgICBHTExvZygiZ2xMb2FkTWF0cml4eCIpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KG0sIDE2KTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xMb2dpY09wKShHTGVudW0gb3Bjb2RlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xMb2dpY09wLCBvcGNvZGUpOworICAgIEdMTG9nKCJnbExvZ2ljT3AiKSA8PCBHTExvZ0VudW0ob3Bjb2RlKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xNYXRlcmlhbGYpKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKKyAgICBDQUxMX0dMX0FQSShnbE1hdGVyaWFsZiwgZmFjZSwgcG5hbWUsIHBhcmFtKTsKKyAgICBHTExvZygiZ2xNYXRlcmlhbGYiKSA8PCBHTExvZ0VudW0oZmFjZSkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBwYXJhbTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xNYXRlcmlhbGZ2KShHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbE1hdGVyaWFsZnYsIGZhY2UsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsTWF0ZXJpYWxmdiIpIDw8IEdMTG9nRW51bShmYWNlKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZmxvYXQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTWF0ZXJpYWx4KShHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xNYXRlcmlhbHgsIGZhY2UsIHBuYW1lLCBwYXJhbSk7CisgICAgR0xMb2coImdsTWF0ZXJpYWx4IikgPDwgR0xMb2dFbnVtKGZhY2UpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dGaXhlZChwYXJhbSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTWF0ZXJpYWx4dikoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xNYXRlcmlhbHh2LCBmYWNlLCBwbmFtZSwgcGFyYW1zKTsKKyAgICAvLyBYWFg6IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgorICAgIEdMTG9nKCJnbE1hdGVyaWFseHYiKSA8PCBHTExvZ0VudW0oZmFjZSkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0J1ZmZlcjxHTGZpeGVkPihwYXJhbXMpOworfQorCit2b2lkIEFQSV9FTlRSWShnbE1hdHJpeE1vZGUpKEdMZW51bSBtb2RlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xNYXRyaXhNb2RlLCBtb2RlKTsKKyAgICBHTExvZygiZ2xNYXRyaXhNb2RlIikgPDwgR0xMb2dFbnVtKG1vZGUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbE11bHRNYXRyaXhmKShjb25zdCBHTGZsb2F0ICptKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xNdWx0TWF0cml4ZiwgbSk7CisgICAgR0xMb2coImdsTXVsdE1hdHJpeGYiKSA8PCBHTExvZ0J1ZmZlcjxHTGZsb2F0PihtLCAxNik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTXVsdE1hdHJpeHgpKGNvbnN0IEdMZml4ZWQgKm0pIHsKKyAgICBDQUxMX0dMX0FQSShnbE11bHRNYXRyaXh4LCBtKTsKKyAgICBHTExvZygiZ2xNdWx0TWF0cml4eCIpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KG0sIDE2KTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xNdWx0aVRleENvb3JkNGYpKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSkgeworICAgIENBTExfR0xfQVBJKGdsTXVsdGlUZXhDb29yZDRmLCB0YXJnZXQsIHMsIHQsIHIsIHEpOworICAgIEdMTG9nKCJnbE11bHRpVGV4Q29vcmQ0ZiIpIDw8IEdMTG9nRW51bSh0YXJnZXQpIDw8IHMgPDwgdCA8PCByIDw8IHE7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTXVsdGlUZXhDb29yZDR4KShHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpIHsKKyAgICBDQUxMX0dMX0FQSShnbE11bHRpVGV4Q29vcmQ0eCwgdGFyZ2V0LCBzLCB0LCByLCBxKTsKKyAgICBHTExvZygiZ2xNdWx0aVRleENvb3JkNHgiKSA8PCBHTExvZ0VudW0odGFyZ2V0KQorICAgICAgICA8PCBHTExvZ0ZpeGVkKHMpIDw8IEdMTG9nRml4ZWQodCkgPDwgR0xMb2dGaXhlZChyKSA8PCBHTExvZ0ZpeGVkKHEpOworfQorCit2b2lkIEFQSV9FTlRSWShnbE5vcm1hbDNmKShHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xOb3JtYWwzZiwgbngsIG55LCBueik7CisgICAgR0xMb2coImdsTm9ybWFsM2YiKSA8PCBueCA8PCBueSA8PCBuejsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xOb3JtYWwzeCkoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueikgeworICAgIENBTExfR0xfQVBJKGdsTm9ybWFsM3gsIG54LCBueSwgbnopOworICAgIEdMTG9nKCJnbE5vcm1hbDN4IikgPDwgR0xMb2dGaXhlZChueCkgPDwgR0xMb2dGaXhlZChueSkgPDwgR0xMb2dGaXhlZChueik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsTm9ybWFsUG9pbnRlcikoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKKyAgICBDQUxMX0dMX0FQSShnbE5vcm1hbFBvaW50ZXIsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7CisgICAgR0xMb2coImdsTm9ybWFsUG9pbnRlciIpIDw8IEdMTG9nRW51bSh0eXBlKSA8PCBzdHJpZGUgPDwgcG9pbnRlcjsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xPcnRob2YpKCAgR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LAorICAgICAgICAgICAgICAgIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwKKyAgICAgICAgICAgICAgICBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpIHsKKyAgICBDQUxMX0dMX0FQSShnbE9ydGhvZiwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcik7CisgICAgR0xMb2coImdsT3J0aG9mIikgPDwgbGVmdCA8PCByaWdodCA8PCBib3R0b20gPDwgdG9wIDw8IHpOZWFyIDw8IHpGYXI7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsT3J0aG94KSggIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwKKyAgICAgICAgICAgICAgICBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsCisgICAgICAgICAgICAgICAgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xPcnRob3gsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOworICAgIEdMTG9nKCJnbE9ydGhveCIpIDw8IEdMTG9nRml4ZWQobGVmdCkgPDwgR0xMb2dGaXhlZChyaWdodCkKKyAgICAgICAgICAgIDw8IEdMTG9nRml4ZWQoYm90dG9tKSA8PCBHTExvZ0ZpeGVkKHRvcCkKKyAgICAgICAgICAgIDw8IEdMTG9nRml4ZWQoek5lYXIpIDw8IEdMTG9nRml4ZWQoekZhcik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsUGl4ZWxTdG9yZWkpKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKKyAgICBDQUxMX0dMX0FQSShnbFBpeGVsU3RvcmVpLCBwbmFtZSwgcGFyYW0pOworICAgIEdMTG9nKCJnbFBpeGVsU3RvcmVpIikgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBwYXJhbTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xQb2ludFNpemUpKEdMZmxvYXQgc2l6ZSkgeworICAgIENBTExfR0xfQVBJKGdsUG9pbnRTaXplLCBzaXplKTsKKyAgICBHTExvZygiZ2xQb2ludFNpemUiKSA8PCBzaXplOworfQorCit2b2lkIEFQSV9FTlRSWShnbFBvaW50U2l6ZXgpKEdMZml4ZWQgc2l6ZSkgeworICAgIENBTExfR0xfQVBJKGdsUG9pbnRTaXpleCwgc2l6ZSk7CisgICAgR0xMb2coImdsUG9pbnRTaXpleCIpIDw8IEdMTG9nRml4ZWQoc2l6ZSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsUG9seWdvbk9mZnNldCkoR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFBvbHlnb25PZmZzZXQsIGZhY3RvciwgdW5pdHMpOworICAgIEdMTG9nKCJnbFBvbHlnb25PZmZzZXQiKSA8PCBmYWN0b3IgPDwgdW5pdHM7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsUG9seWdvbk9mZnNldHgpKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2x5Z29uT2Zmc2V0eCwgZmFjdG9yLCB1bml0cyk7CisgICAgR0xMb2coImdsUG9seWdvbk9mZnNldHgiKSA8PCBHTExvZ0ZpeGVkKGZhY3RvcikgPDwgR0xMb2dGaXhlZCh1bml0cyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsUG9wTWF0cml4KSh2b2lkKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb3BNYXRyaXgpOworICAgIEdMTG9nKCJnbFBvcE1hdHJpeCIpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFB1c2hNYXRyaXgpKHZvaWQpIHsKKyAgICBDQUxMX0dMX0FQSShnbFB1c2hNYXRyaXgpOworICAgIEdMTG9nKCJnbFB1c2hNYXRyaXgiKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xSZWFkUGl4ZWxzKSggIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFJlYWRQaXhlbHMsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKKyAgICAvLyBYWFg6IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgorICAgIEdMTG9nKCJnbFJlYWRQaXhlbHMiKSA8PCB4IDw8IHkgPDwgd2lkdGggPDwgaGVpZ2h0IDw8IEdMTG9nRW51bShmb3JtYXQpIDw8IEdMTG9nRW51bSh0eXBlKQorICAgICAgICAgICAgPDwgR0xMb2dCdWZmZXI8dW5zaWduZWQgY2hhcj4oc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhciAqPihwaXhlbHMpKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xSb3RhdGVmKShHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xSb3RhdGVmLCBhbmdsZSwgeCwgeSwgeik7CisgICAgR0xMb2coImdsUm90YXRlZiIpIDw8IGFuZ2xlIDw8IHggPDwgeSA8PCB6OworfQorCit2b2lkIEFQSV9FTlRSWShnbFJvdGF0ZXgpKEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopIHsKKyAgICBDQUxMX0dMX0FQSShnbFJvdGF0ZXgsIGFuZ2xlLCB4LCB5LCB6KTsKKyAgICBHTExvZygiZ2xSb3RhdGV4IikgPDwgR0xMb2dGaXhlZChhbmdsZSkgPDwgR0xMb2dGaXhlZCh4KSA8PCBHTExvZ0ZpeGVkKHkpIDw8IEdMTG9nRml4ZWQoeik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsU2FtcGxlQ292ZXJhZ2UpKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTYW1wbGVDb3ZlcmFnZSwgdmFsdWUsIGludmVydCk7CisgICAgR0xMb2coImdsU2FtcGxlQ292ZXJhZ2UiKSA8PCB2YWx1ZSA8PCBHTExvZ0Jvb2woaW52ZXJ0KTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xTYW1wbGVDb3ZlcmFnZXgpKEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTYW1wbGVDb3ZlcmFnZXgsIHZhbHVlLCBpbnZlcnQpOworICAgIEdMTG9nKCJnbFNhbXBsZUNvdmVyYWdleCIpIDw8IEdMTG9nRml4ZWQodmFsdWUpIDw8IEdMTG9nQm9vbChpbnZlcnQpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFNjYWxlZikoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgeworICAgIENBTExfR0xfQVBJKGdsU2NhbGVmLCB4LCB5LCB6KTsKKyAgICBHTExvZygiZ2xTY2FsZWYiKSA8PCB4IDw8IHkgPDwgejsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xTY2FsZXgpKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopIHsKKyAgICBDQUxMX0dMX0FQSShnbFNjYWxleCwgeCwgeSwgeik7CisgICAgR0xMb2coImdsU2NhbGV4IikgPDwgR0xMb2dGaXhlZCh4KSA8PCBHTExvZ0ZpeGVkKHkpIDw8IEdMTG9nRml4ZWQoeik7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsU2Npc3NvcikoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKKyAgICBDQUxMX0dMX0FQSShnbFNjaXNzb3IsIHgsIHksIHdpZHRoLCBoZWlnaHQpOworICAgIEdMTG9nKCJnbFNjaXNzb3IiKSA8PCB4IDw8IHkgPDwgd2lkdGggPDwgaGVpZ2h0OworfQorCit2b2lkIEFQSV9FTlRSWShnbFNoYWRlTW9kZWwpKEdMZW51bSBtb2RlKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTaGFkZU1vZGVsLCBtb2RlKTsKKyAgICBHTExvZygiZ2xTaGFkZU1vZGVsIikgPDwgR0xMb2dFbnVtKG1vZGUpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFN0ZW5jaWxGdW5jKShHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzaykgeworICAgIENBTExfR0xfQVBJKGdsU3RlbmNpbEZ1bmMsIGZ1bmMsIHJlZiwgbWFzayk7CisgICAgR0xMb2coImdsU3RlbmNpbEZ1bmMiKSA8PCBHTExvZ0VudW0oZnVuYykgPDwgcmVmIDw8IG1hc2s7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsU3RlbmNpbE1hc2spKEdMdWludCBtYXNrKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTdGVuY2lsTWFzaywgbWFzayk7CisgICAgR0xMb2coImdsU3RlbmNpbE1hc2siKSA8PCBtYXNrOworfQorCit2b2lkIEFQSV9FTlRSWShnbFN0ZW5jaWxPcCkoR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xTdGVuY2lsT3AsIGZhaWwsIHpmYWlsLCB6cGFzcyk7CisgICAgR0xMb2coImdsU3RlbmNpbE9wIikgPDwgR0xMb2dFbnVtKGZhaWwpIDw8IEdMTG9nRW51bSh6ZmFpbCkgPDwgR0xMb2dFbnVtKHpwYXNzKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhDb29yZFBvaW50ZXIpKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleENvb3JkUG9pbnRlciwgc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKKyAgICBHTExvZygiZ2xUZXhDb29yZFBvaW50ZXIiKSA8PCBzaXplIDw8IEdMTG9nRW51bSh0eXBlKSA8PCBzdHJpZGUgPDwgcG9pbnRlcjsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhFbnZmKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleEVudmYsIHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKKyAgICBHTExvZygiZ2xUZXhFbnZmIikgPDwgR0xMb2dFbnVtKHRhcmdldCkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBwYXJhbTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhFbnZmdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleEVudmZ2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsVGV4RW52eCIpIDw8IEdMTG9nRW51bSh0YXJnZXQpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmbG9hdD4ocGFyYW1zKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhFbnZ4KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleEVudngsIHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKKyAgICBHTExvZygiZ2xUZXhFbnZ4IikgPDwgR0xMb2dFbnVtKHRhcmdldCkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0ZpeGVkKHBhcmFtKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhFbnZ4dikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleEVudnh2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsVGV4RW52eHYiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVGV4SW1hZ2UyRCkoICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscykgeworICAgIENBTExfR0xfQVBJKGdsVGV4SW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICBib3JkZXIsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKKyAgICBHTExvZygiZ2xUZXhJbWFnZTJEIikgPDwgR0xMb2dFbnVtKHRhcmdldCkgPDwgbGV2ZWwgPDwgR0xMb2dFbnVtKGludGVybmFsZm9ybWF0KQorICAgICAgICAgICAgPDwgd2lkdGggPDwgaGVpZ2h0IDw8IGJvcmRlciA8PCBHTExvZ0VudW0oZm9ybWF0KSA8PCBHTExvZ0VudW0odHlwZSkKKyAgICAgICAgICAgIDw8IEdMTG9nQnVmZmVyPHVuc2lnbmVkIGNoYXI+KCBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyICo+KHBpeGVscykpOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcmYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyZiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworICAgIEdMTG9nKCJnbFRleFBhcmFtZXRlcmYiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IHBhcmFtOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcngpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyeCwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworICAgIEdMTG9nKCJnbFRleFBhcmFtZXRlcngiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nRml4ZWQocGFyYW0pOworfQorCit2b2lkIEFQSV9FTlRSWShnbFRleFN1YkltYWdlMkQpKCAgIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleFN1YkltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7CisgICAgR0xMb2coImdsVGV4U3ViSW1hZ2UyRCIpIDw8IEdMTG9nRW51bSh0YXJnZXQpIDw8IGxldmVsIDw8IHhvZmZzZXQgPDwgeW9mZnNldAorICAgICAgICAgICAgPDwgd2lkdGggPDwgaGVpZ2h0IDw8IEdMTG9nRW51bShmb3JtYXQpIDw8IEdMTG9nRW51bSh0eXBlKQorICAgICAgICAgICAgPDwgR0xMb2dCdWZmZXI8dW5zaWduZWQgY2hhcj4oIHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIgKj4ocGl4ZWxzKSk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVHJhbnNsYXRlZikoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgeworICAgIENBTExfR0xfQVBJKGdsVHJhbnNsYXRlZiwgeCwgeSwgeik7CisgICAgR0xMb2coImdsVHJhbnNsYXRlZiIpIDw8IHggPDwgeSA8PCB6OworfQorCit2b2lkIEFQSV9FTlRSWShnbFRyYW5zbGF0ZXgpKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopIHsKKyAgICBDQUxMX0dMX0FQSShnbFRyYW5zbGF0ZXgsIHgsIHksIHopOworICAgIEdMTG9nKCJnbFRyYW5zbGF0ZXgiKSA8PCBHTExvZ0ZpeGVkKHgpIDw8IEdMTG9nRml4ZWQoeSkgPDwgR0xMb2dGaXhlZCh6KTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xWZXJ0ZXhQb2ludGVyKSggICBHTGludCBzaXplLCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKKyAgICBDQUxMX0dMX0FQSShnbFZlcnRleFBvaW50ZXIsIHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7CisgICAgR0xMb2coImdsVmVydGV4UG9pbnRlciIpIDw8IHNpemUgPDwgR0xMb2dFbnVtKHR5cGUpIDw8IHN0cmlkZSA8PCBwb2ludGVyOworfQorCit2b2lkIEFQSV9FTlRSWShnbFZpZXdwb3J0KShHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgeworICAgIENBTExfR0xfQVBJKGdsVmlld3BvcnQsIHgsIHksIHdpZHRoLCBoZWlnaHQpOworICAgIEdMTG9nKCJnbFZpZXdwb3J0IikgPDwgeCA8PCB5IDw8IHdpZHRoIDw8IGhlaWdodDsKK30KKworLy8gRVMgMS4xCit2b2lkIEFQSV9FTlRSWShnbENsaXBQbGFuZWYpKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pIHsKKyAgICBDQUxMX0dMX0FQSShnbENsaXBQbGFuZWYsIHBsYW5lLCBlcXVhdGlvbik7CisgICAgR0xMb2coImdsQ2xpcFBsYW5lZiIpIDw8IEdMTG9nRW51bShwbGFuZSkgPDwgR0xMb2dCdWZmZXI8R0xmbG9hdD4oZXF1YXRpb24sIDQpOworfQordm9pZCBBUElfRU5UUlkoZ2xDbGlwUGxhbmV4KShHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xDbGlwUGxhbmV4LCBwbGFuZSwgZXF1YXRpb24pOworICAgIEdMTG9nKCJnbENsaXBQbGFuZXgiKSA8PCBHTExvZ0VudW0ocGxhbmUpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KGVxdWF0aW9uLCA0KTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsQmluZEJ1ZmZlcikoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcikgeworICAgIENBTExfR0xfQVBJKGdsQmluZEJ1ZmZlciwgdGFyZ2V0LCBidWZmZXIpOworICAgIEdMTG9nKCJnbEJpbmRCdWZmZXIiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBidWZmZXI7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEJ1ZmZlckRhdGEpKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhLCBHTGVudW0gdXNhZ2UpIHsKKyAgICBDQUxMX0dMX0FQSShnbEJ1ZmZlckRhdGEsIHRhcmdldCwgc2l6ZSwgZGF0YSwgdXNhZ2UpOworICAgIEdMTG9nKCJnbEJ1ZmZlckRhdGEiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBzaXplCisgICAgICAgIDw8IEdMTG9nQnVmZmVyPHVuc2lnbmVkIGNoYXI+KHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihkYXRhKSwgc2l6ZSk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEJ1ZmZlclN1YkRhdGEpKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbEJ1ZmZlclN1YkRhdGEsIHRhcmdldCwgb2Zmc2V0LCBzaXplLCBkYXRhKTsKKyAgICBHTExvZygiZ2xCdWZmZXJTdWJEYXRhIikgPDwgR0xMb2dFbnVtKHRhcmdldCkgPDwgb2Zmc2V0IDw8IHNpemUKKyAgICAgICAgPDwgR0xMb2dCdWZmZXI8dW5zaWduZWQgY2hhcj4oc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGRhdGEpLCBzaXplKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsRGVsZXRlQnVmZmVycykoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGJ1ZmZlcnMpIHsKKyAgICBDQUxMX0dMX0FQSShnbERlbGV0ZUJ1ZmZlcnMsIG4sIGJ1ZmZlcnMpOworICAgIEdMTG9nKCJnbERlbGV0ZUJ1ZmZlcnMiKSA8PCBuIDw8IEdMTG9nQnVmZmVyPEdMdWludD4oYnVmZmVycywgbik7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdlbkJ1ZmZlcnMpKEdMc2l6ZWkgbiwgR0x1aW50KiBidWZmZXJzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZW5CdWZmZXJzLCBuLCBidWZmZXJzKTsKKyAgICBHTExvZygiZ2xHZW5CdWZmZXJzIikgPDwgbiA8PCBHTExvZ0J1ZmZlcjxHTHVpbnQ+KGJ1ZmZlcnMsIG4pOworfQordm9pZCBBUElfRU5UUlkoZ2xHZXRCb29sZWFudikoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0Qm9vbGVhbnYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsR2V0Qm9vbGVhbnYiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMYm9vbGVhbj4ocGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0Rml4ZWR2KShHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0Rml4ZWR2LCBwbmFtZSwgcGFyYW1zKTsKKyAgICAvLyBYWFg6IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgorICAgIEdMTG9nKCJnbEdldEZpeGVkdiIpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmaXhlZD4ocGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0RmxvYXR2KShHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0RmxvYXR2LCBwbmFtZSwgcGFyYW1zKTsKKyAgICAvLyBYWFg6IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgorICAgIEdMTG9nKCJnbEdldEZsb2F0diIpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmbG9hdD4ocGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0UG9pbnRlcnYpKEdMZW51bSBwbmFtZSwgdm9pZCAqKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0UG9pbnRlcnYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsR2V0UG9pbnRlcnYiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPHZvaWQqPihwYXJhbXMpOworfQordm9pZCBBUElfRU5UUlkoZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBDQUxMX0dMX0FQSShnbEdldEJ1ZmZlclBhcmFtZXRlcml2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworICAgIEdMTG9nKCJnbEdldEJ1ZmZlclBhcmFtZXRlcml2IikgPDwgR0xMb2dFbnVtKHRhcmdldCkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0J1ZmZlcjxHTGludD4ocGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0Q2xpcFBsYW5lZikoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSkgeworICAgIENBTExfR0xfQVBJKGdsR2V0Q2xpcFBsYW5lZiwgcG5hbWUsIGVxbik7CisgICAgR0xMb2coImdsR2V0Q2xpcFBsYW5lZiIpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmbG9hdD4oZXFuLCA0KTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0Q2xpcFBsYW5leCkoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSkgeworICAgIENBTExfR0xfQVBJKGdsR2V0Q2xpcFBsYW5leCwgcG5hbWUsIGVxbik7CisgICAgR0xMb2coImdsR2V0Q2xpcFBsYW5leCIpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmaXhlZD4oZXFuLCA0KTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0TGlnaHR4dikoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0TGlnaHR4diwgbGlnaHQsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsR2V0TGlnaHR4diIpIDw8IEdMTG9nRW51bShsaWdodCkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0J1ZmZlcjxHTGZpeGVkPihwYXJhbXMpOworfQordm9pZCBBUElfRU5UUlkoZ2xHZXRMaWdodGZ2KShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZXRMaWdodGZ2LCBsaWdodCwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xHZXRMaWdodGZ2IikgPDwgR0xMb2dFbnVtKGxpZ2h0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZmxvYXQ+KHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldE1hdGVyaWFseHYpKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0TWF0ZXJpYWx4diwgZmFjZSwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xHZXRNYXRlcmlhbHh2IikgPDwgR0xMb2dFbnVtKGZhY2UpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmaXhlZD4ocGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0TWF0ZXJpYWxmdikoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xHZXRNYXRlcmlhbGZ2LCBmYWNlLCBwbmFtZSwgcGFyYW1zKTsKKyAgICAvLyBYWFg6IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgorICAgIEdMTG9nKCJnbEdldE1hdGVyaWFsZnYiKSA8PCBHTExvZ0VudW0oZmFjZSkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0J1ZmZlcjxHTGZsb2F0PihwYXJhbXMpOworfQordm9pZCBBUElfRU5UUlkoZ2xHZXRUZXhFbnZmdikoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEdldFRleEVudmZ2LCBlbnYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsR2V0VGV4RW52ZnYiKSA8PCBHTExvZ0VudW0oZW52KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZmxvYXQ+KHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldFRleEVudml2KShHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEdldFRleEVudml2LCBlbnYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsR2V0VGV4RW52aXYiKSA8PCBHTExvZ0VudW0oZW52KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMaW50PihwYXJhbXMpOworfQordm9pZCBBUElfRU5UUlkoZ2xHZXRUZXhFbnZ4dikoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbEdldFRleEVudnh2LCBlbnYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsR2V0VGV4RW52eHYiKSA8PCBHTExvZ0VudW0oZW52KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldFRleFBhcmFtZXRlcmZ2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0VGV4UGFyYW1ldGVyZnYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xHZXRUZXhQYXJhbWV0ZXJmdiIpIDw8IEdMTG9nRW51bSh0YXJnZXQpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmbG9hdD4ocGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4UGFyYW1ldGVyaXYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0VGV4UGFyYW1ldGVyaXYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xHZXRUZXhQYXJhbWV0ZXJpdiIpIDw8IEdMTG9nRW51bSh0YXJnZXQpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xpbnQ+KHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbEdldFRleFBhcmFtZXRlcnh2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsR2V0VGV4UGFyYW1ldGVyeHYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xHZXRUZXhQYXJhbWV0ZXJ4diIpIDw8IEdMTG9nRW51bSh0YXJnZXQpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmaXhlZD4ocGFyYW1zKTsKK30KK0dMYm9vbGVhbiBBUElfRU5UUlkoZ2xJc0J1ZmZlcikoR0x1aW50IGJ1ZmZlcikgeworICAgIEdMTG9nKCJnbElzQnVmZmVyIikgPDwgYnVmZmVyOworICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzQnVmZmVyLCBidWZmZXIpOworfQorR0xib29sZWFuIEFQSV9FTlRSWShnbElzRW5hYmxlZCkoR0xlbnVtIGNhcCkgeworICAgIEdMTG9nKCJnbElzRW5hYmxlZCIpIDw8IEdMTG9nRW51bShjYXApOworICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzRW5hYmxlZCwgY2FwKTsKK30KK0dMYm9vbGVhbiBBUElfRU5UUlkoZ2xJc1RleHR1cmUpKEdMdWludCB0ZXh0dXJlKSB7CisgICAgR0xMb2coImdsSXNUZXh0dXJlIikgPDwgdGV4dHVyZTsKKyAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xJc1RleHR1cmUsIHRleHR1cmUpOworfQordm9pZCBBUElfRU5UUlkoZ2xQb2ludFBhcmFtZXRlcmYpKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsUG9pbnRQYXJhbWV0ZXJmLCBwbmFtZSwgcGFyYW0pOworICAgIEdMTG9nKCJnbFBvaW50UGFyYW1ldGVyZiIpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgcGFyYW07Cit9Cit2b2lkIEFQSV9FTlRSWShnbFBvaW50UGFyYW1ldGVyZnYpKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFBhcmFtZXRlcmZ2LCBwbmFtZSwgcGFyYW1zKTsKKyAgICAvLyBYWFg6IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgorICAgIEdMTG9nKCJnbFBvaW50UGFyYW1ldGVyZnYiKSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZmxvYXQ+KHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbFBvaW50UGFyYW1ldGVyeCkoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFBhcmFtZXRlcngsIHBuYW1lLCBwYXJhbSk7CisgICAgR0xMb2coImdsUG9pbnRQYXJhbWV0ZXJ4IikgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0ZpeGVkKHBhcmFtKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsUG9pbnRQYXJhbWV0ZXJ4dikoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFBvaW50UGFyYW1ldGVyeHYsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsUG9pbnRQYXJhbWV0ZXJ4diIpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xmaXhlZD4ocGFyYW1zKTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsQ29sb3I0dWIpKEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEpIHsKKyAgICBDQUxMX0dMX0FQSShnbENvbG9yNHViLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgR0xMb2coImdsQ29sb3I0dWIiKSA8PCByZWQgPDwgZ3JlZW4gPDwgYmx1ZSA8PCBhbHBoYTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsVGV4RW52aSkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsVGV4RW52aSwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworICAgIEdMTG9nKCJnbFRleEVudmkiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IHBhcmFtOworfQordm9pZCBBUElfRU5UUlkoZ2xUZXhFbnZpdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xUZXhFbnZpdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKKyAgICAvLyBYWFg6IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgorICAgIEdMTG9nKCJnbFRleEVudml2IikgPDwgR0xMb2dFbnVtKHRhcmdldCkgPDwgR0xMb2dFbnVtKHBuYW1lKSA8PCBHTExvZ0J1ZmZlcjxHTGludD4ocGFyYW1zKTsKK30KKwordm9pZCBBUElfRU5UUlkoZ2xUZXhQYXJhbWV0ZXJmdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleFBhcmFtZXRlcmZ2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsVGV4UGFyYW1ldGVyZnYiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZmxvYXQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVGV4UGFyYW1ldGVyaXYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcykgeworICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyaXYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7CisgICAgLy8gWFhYOiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhpcyBidWZmZXIKKyAgICBHTExvZygiZ2xUZXhQYXJhbWV0ZXJpdiIpIDw8IEdMTG9nRW51bSh0YXJnZXQpIDw8IEdMTG9nRW51bShwbmFtZSkgPDwgR0xMb2dCdWZmZXI8R0xpbnQ+KHBhcmFtcyk7Cit9CisKK3ZvaWQgQVBJX0VOVFJZKGdsVGV4UGFyYW1ldGVyaSkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkgeworICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyaSwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworICAgIEdMTG9nKCJnbFRleFBhcmFtZXRlcmkiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IHBhcmFtOworfQordm9pZCBBUElfRU5UUlkoZ2xUZXhQYXJhbWV0ZXJ4dikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBDQUxMX0dMX0FQSShnbFRleFBhcmFtZXRlcnh2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworICAgIC8vIFhYWDogd2UgbmVlZCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCisgICAgR0xMb2coImdsVGV4UGFyYW1ldGVyeHYiKSA8PCBHTExvZ0VudW0odGFyZ2V0KSA8PCBHTExvZ0VudW0ocG5hbWUpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KHBhcmFtcyk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbFBvaW50U2l6ZVBvaW50ZXJPRVMpKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xQb2ludFNpemVQb2ludGVyT0VTLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOworICAgIEdMTG9nKCJnbFBvaW50U2l6ZVBvaW50ZXJPRVMiKSA8PCBHTExvZ0VudW0odHlwZSkgPDwgc3RyaWRlIDw8IHBvaW50ZXI7Cit9CisKKy8vIEV4dGVuc2lvbnMKK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleHNPRVMpKEdMc2hvcnQgeCAsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcsIEdMc2hvcnQgaCkgeworICAgIENBTExfR0xfQVBJKGdsRHJhd1RleHNPRVMsIHgsIHksIHosIHcsIGgpOworICAgIEdMTG9nKCJnbERyYXdUZXhzT0VTIikgPDwgeCA8PCB5IDw8IHogPDwgdyA8PCBoOworfQordm9pZCBBUElfRU5UUlkoZ2xEcmF3VGV4aU9FUykoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdywgR0xpbnQgaCkgeworICAgIENBTExfR0xfQVBJKGdsRHJhd1RleGlPRVMsIHgsIHksIHosIHcsIGgpOworICAgIEdMTG9nKCJnbERyYXdUZXhpT0VTIikgPDwgeCA8PCB5IDw8IHogPDwgdyA8PCBoOworfQordm9pZCBBUElfRU5UUlkoZ2xEcmF3VGV4Zk9FUykoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3LCBHTGZsb2F0IGgpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdUZXhmT0VTLCB4LCB5LCB6LCB3LCBoKTsKKyAgICBHTExvZygiZ2xEcmF3VGV4Zk9FUyIpIDw8IHggPDwgeSA8PCB6IDw8IHcgPDwgaDsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleHhPRVMpKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgdywgR0xmaXhlZCBoKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEcmF3VGV4eE9FUywgeCwgeSwgeiwgdywgaCk7CisgICAgR0xMb2coImdsRHJhd1RleGZPRVMiKSA8PCBHTExvZ0ZpeGVkKHgpIDw8IEdMTG9nRml4ZWQoeSkgPDwgR0xMb2dGaXhlZCh6KSA8PCBHTExvZ0ZpeGVkKHcpIDw8IEdMTG9nRml4ZWQoaCk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbERyYXdUZXhzdk9FUykoY29uc3QgR0xzaG9ydCogY29vcmRzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEcmF3VGV4c3ZPRVMsIGNvb3Jkcyk7CisgICAgR0xMb2coImdsRHJhd1RleHN2T0VTIikgPDwgR0xMb2dCdWZmZXI8R0xzaG9ydD4oY29vcmRzLCA1KTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleGl2T0VTKShjb25zdCBHTGludCogY29vcmRzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEcmF3VGV4aXZPRVMsIGNvb3Jkcyk7CisgICAgR0xMb2coImdsRHJhd1RleGl2T0VTIikgPDwgR0xMb2dCdWZmZXI8R0xpbnQ+KGNvb3JkcywgNSk7Cit9Cit2b2lkIEFQSV9FTlRSWShnbERyYXdUZXhmdk9FUykoY29uc3QgR0xmbG9hdCogY29vcmRzKSB7CisgICAgQ0FMTF9HTF9BUEkoZ2xEcmF3VGV4ZnZPRVMsIGNvb3Jkcyk7CisgICAgR0xMb2coImdsRHJhd1RleGZ2T0VTIikgPDwgR0xMb2dCdWZmZXI8R0xmbG9hdD4oY29vcmRzLCA1KTsKK30KK3ZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleHh2T0VTKShjb25zdCBHTGZpeGVkKiBjb29yZHMpIHsKKyAgICBDQUxMX0dMX0FQSShnbERyYXdUZXh4dk9FUywgY29vcmRzKTsKKyAgICBHTExvZygiZ2xEcmF3VGV4eHZPRVMiKSA8PCBHTExvZ0J1ZmZlcjxHTGZpeGVkPihjb29yZHMsIDUpOworfQorR0xiaXRmaWVsZCBBUElfRU5UUlkoZ2xRdWVyeU1hdHJpeHhPRVMpKEdMZml4ZWQqIG1hbnRpc3NhLCBHTGludCogZXhwb25lbnQpIHsKKyAgICBHTExvZygiZ2xRdWVyeU1hdHJpeHhPRVMiKSA8PCBHTExvZ0J1ZmZlcjxHTGZpeGVkPihtYW50aXNzYSwgMTYpIDw8IEdMTG9nQnVmZmVyPEdMZml4ZWQ+KGV4cG9uZW50LCAxNik7CisgICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsUXVlcnlNYXRyaXh4T0VTLCBtYW50aXNzYSwgZXhwb25lbnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvZWdsX2VudHJpZXMuaW4gYi9vcGVuZ2wvbGlicy9lZ2xfZW50cmllcy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I0YzY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYnMvZWdsX2VudHJpZXMuaW4KQEAgLTAsMCArMSw0NSBAQAorRUdMX0VOVFJZKEVHTERpc3BsYXksIGVnbEdldERpc3BsYXksIE5hdGl2ZURpc3BsYXlUeXBlKQorRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbEluaXRpYWxpemUsIEVHTERpc3BsYXksIEVHTGludCosIEVHTGludCopCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsVGVybWluYXRlLCBFR0xEaXNwbGF5KQorRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbEdldENvbmZpZ3MsIEVHTERpc3BsYXksIEVHTENvbmZpZyosIEVHTGludCwgRUdMaW50KikKK0VHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xDaG9vc2VDb25maWcsIEVHTERpc3BsYXksIGNvbnN0IEVHTGludCAqLCBFR0xDb25maWcgKiwgRUdMaW50LCBFR0xpbnQgKikKKworRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbEdldENvbmZpZ0F0dHJpYiwgRUdMRGlzcGxheSwgRUdMQ29uZmlnLCBFR0xpbnQsIEVHTGludCAqKQorRUdMX0VOVFJZKEVHTFN1cmZhY2UsIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UsIEVHTERpc3BsYXksIEVHTENvbmZpZywgTmF0aXZlV2luZG93VHlwZSwgY29uc3QgRUdMaW50ICopCitFR0xfRU5UUlkoRUdMU3VyZmFjZSwgZWdsQ3JlYXRlUGl4bWFwU3VyZmFjZSwgRUdMRGlzcGxheSwgRUdMQ29uZmlnLCBOYXRpdmVQaXhtYXBUeXBlLCBjb25zdCBFR0xpbnQgKikKK0VHTF9FTlRSWShFR0xTdXJmYWNlLCBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZSwgIEVHTERpc3BsYXksIEVHTENvbmZpZywgY29uc3QgRUdMaW50ICopCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsRGVzdHJveVN1cmZhY2UsIEVHTERpc3BsYXksIEVHTFN1cmZhY2UpCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsUXVlcnlTdXJmYWNlLCAgRUdMRGlzcGxheSwgRUdMU3VyZmFjZSwgRUdMaW50LCBFR0xpbnQgKikKK0VHTF9FTlRSWShFR0xDb250ZXh0LCBlZ2xDcmVhdGVDb250ZXh0LCBFR0xEaXNwbGF5LCBFR0xDb25maWcsIEVHTENvbnRleHQsIGNvbnN0IEVHTGludCAqKQorRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbERlc3Ryb3lDb250ZXh0LCBFR0xEaXNwbGF5LCBFR0xDb250ZXh0KQorRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbE1ha2VDdXJyZW50LCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlLCBFR0xTdXJmYWNlLCBFR0xDb250ZXh0KQorRUdMX0VOVFJZKEVHTENvbnRleHQsIGVnbEdldEN1cnJlbnRDb250ZXh0LCB2b2lkKQorRUdMX0VOVFJZKEVHTFN1cmZhY2UsIGVnbEdldEN1cnJlbnRTdXJmYWNlLCBFR0xpbnQpCitFR0xfRU5UUlkoRUdMRGlzcGxheSwgZWdsR2V0Q3VycmVudERpc3BsYXksIHZvaWQpCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsUXVlcnlDb250ZXh0LCAgRUdMRGlzcGxheSwgRUdMQ29udGV4dCwgRUdMaW50LCBFR0xpbnQgKikKK0VHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xXYWl0R0wsIHZvaWQpCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsV2FpdE5hdGl2ZSwgRUdMaW50KQorRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbFN3YXBCdWZmZXJzLCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlKQorRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbENvcHlCdWZmZXJzLCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlLCBOYXRpdmVQaXhtYXBUeXBlKQorRUdMX0VOVFJZKEVHTGludCwgZWdsR2V0RXJyb3IsIHZvaWQpCitFR0xfRU5UUlkoY29uc3QgY2hhciosIGVnbFF1ZXJ5U3RyaW5nLCBFR0xEaXNwbGF5LCBFR0xpbnQpCitFR0xfRU5UUlkoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSwgZWdsR2V0UHJvY0FkZHJlc3MsIGNvbnN0IGNoYXIgKikKKworLyogRUdMIDEuMSAqLworCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsU3VyZmFjZUF0dHJpYiwgRUdMRGlzcGxheSwgRUdMU3VyZmFjZSwgRUdMaW50LCBFR0xpbnQpCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsQmluZFRleEltYWdlLCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlLCBFR0xpbnQpCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsUmVsZWFzZVRleEltYWdlLCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlLCBFR0xpbnQpCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsU3dhcEludGVydmFsLCBFR0xEaXNwbGF5LCBFR0xpbnQpCisKKy8qIEVHTCAxLjIgKi8KKworRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbEJpbmRBUEksIEVHTGVudW0pCitFR0xfRU5UUlkoRUdMZW51bSwgZWdsUXVlcnlBUEksIHZvaWQpCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsV2FpdENsaWVudCwgdm9pZCkKK0VHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xSZWxlYXNlVGhyZWFkLCB2b2lkKQorRUdMX0VOVFJZKEVHTFN1cmZhY2UsIGVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyLCBFR0xEaXNwbGF5LCBFR0xlbnVtLCBFR0xDbGllbnRCdWZmZXIsIEVHTENvbmZpZywgY29uc3QgRUdMaW50ICopCisKKy8qIEVHTCAxLjMgKi8KKworLyogRUdMIDEuNCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvZWdsX2ltcGwuaCBiL29wZW5nbC9saWJzL2VnbF9pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjZTNmYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJzL2VnbF9pbXBsLmgKQEAgLTAsMCArMSw0MyBAQAorLyogCisgKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqKgorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKioKKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FR0xfSU1QTF9ICisjZGVmaW5lIEFORFJPSURfRUdMX0lNUExfSAorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3QgZ2xfaG9va3NfdDsKKworc3RydWN0IGVnbF9jb25uZWN0aW9uX3QKK3sKKyAgICB2b2lkIHZvbGF0aWxlICogICAgIGRzbzsKKyAgICBnbF9ob29rc190ICogICAgICAgIGhvb2tzOworICAgIEVHTGludCAgICAgICAgICAgICAgbWFqb3I7CisgICAgRUdMaW50ICAgICAgICAgICAgICBtaW5vcjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHVuYXZhaWxhYmxlOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8qIEFORFJPSURfRUdMX0lNUExfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvZ2xfZW50cmllcy5pbiBiL29wZW5nbC9saWJzL2dsX2VudHJpZXMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk3ZThmZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJzL2dsX2VudHJpZXMuaW4KQEAgLTAsMCArMSwxNTkgQEAKK0dMX0VOVFJZKHZvaWQsIGdsQ29sb3I0ZiwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCkKK0dMX0VOVFJZKHZvaWQsIGdsQ29sb3I0eCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCkKK0dMX0VOVFJZKHZvaWQsIGdsTm9ybWFsM2YsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpCitHTF9FTlRSWSh2b2lkLCBnbE5vcm1hbDN4LCBHTGZpeGVkLCBHTGZpeGVkLCBHTGZpeGVkKQorR0xfRU5UUlkodm9pZCwgZ2xDdWxsRmFjZSwgR0xlbnVtKQorR0xfRU5UUlkodm9pZCwgZ2xGcm9udEZhY2UsIEdMZW51bSkKK0dMX0VOVFJZKHZvaWQsIGdsRGlzYWJsZSwgR0xlbnVtKQorR0xfRU5UUlkodm9pZCwgZ2xFbmFibGUsIEdMZW51bSkKK0dMX0VOVFJZKHZvaWQsIGdsRmluaXNoLCB2b2lkKQorR0xfRU5UUlkodm9pZCwgZ2xGbHVzaCwgdm9pZCkKK0dMX0VOVFJZKEdMZW51bSwgZ2xHZXRFcnJvciwgdm9pZCkKK0dMX0VOVFJZKGNvbnN0IEdMdWJ5dGUqLCBnbEdldFN0cmluZywgR0xlbnVtKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRJbnRlZ2VydiwgR0xlbnVtLCBHTGludCAqKQorR0xfRU5UUlkodm9pZCwgZ2xDb2xvck1hc2ssIEdMYm9vbGVhbiwgR0xib29sZWFuLCBHTGJvb2xlYW4sIEdMYm9vbGVhbikKK0dMX0VOVFJZKHZvaWQsIGdsRGVwdGhNYXNrLCBHTGJvb2xlYW4pCitHTF9FTlRSWSh2b2lkLCBnbFN0ZW5jaWxNYXNrLCBHTHVpbnQpCitHTF9FTlRSWSh2b2lkLCBnbERlcHRoRnVuYywgR0xlbnVtKQorR0xfRU5UUlkodm9pZCwgZ2xEZXB0aFJhbmdlZiwgR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpCitHTF9FTlRSWSh2b2lkLCBnbERlcHRoUmFuZ2V4LCBHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcikKK0dMX0VOVFJZKHZvaWQsIGdsUG9seWdvbk9mZnNldCwgR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpCitHTF9FTlRSWSh2b2lkLCBnbFBvbHlnb25PZmZzZXR4LCBHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cykKK0dMX0VOVFJZKHZvaWQsIGdsTG9naWNPcCwgR0xlbnVtIG9wY29kZSkKK0dMX0VOVFJZKHZvaWQsIGdsQWxwaGFGdW5jeCwgR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZikKK0dMX0VOVFJZKHZvaWQsIGdsQWxwaGFGdW5jLCBHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKQorR0xfRU5UUlkodm9pZCwgZ2xCbGVuZEZ1bmMsIEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvcikKK0dMX0VOVFJZKHZvaWQsIGdsQ2xlYXIsIEdMYml0ZmllbGQgbWFzaykKK0dMX0VOVFJZKHZvaWQsIGdsQ2xlYXJDb2xvciwgR0xjbGFtcGYgciwgR0xjbGFtcGYgZywgR0xjbGFtcGYgYiwgR0xjbGFtcGYgYSkKK0dMX0VOVFJZKHZvaWQsIGdsQ2xlYXJDb2xvcngsIEdMY2xhbXB4IHIsIEdMY2xhbXB4IGcsIEdMY2xhbXB4IGIsIEdMY2xhbXB4IGEpCitHTF9FTlRSWSh2b2lkLCBnbENsZWFyRGVwdGhmLCBHTGNsYW1wZiBkZXB0aCkKK0dMX0VOVFJZKHZvaWQsIGdsQ2xlYXJEZXB0aHgsIEdMY2xhbXB4IGRlcHRoKQorR0xfRU5UUlkodm9pZCwgZ2xDbGVhclN0ZW5jaWwsIEdMaW50IHMpCitHTF9FTlRSWSh2b2lkLCBnbFBvaW50U2l6ZSwgR0xmbG9hdCkKK0dMX0VOVFJZKHZvaWQsIGdsUG9pbnRTaXpleCwgR0xmaXhlZCkKK0dMX0VOVFJZKHZvaWQsIGdsU2FtcGxlQ292ZXJhZ2UsIEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KQorR0xfRU5UUlkodm9pZCwgZ2xTYW1wbGVDb3ZlcmFnZXgsIEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KQorR0xfRU5UUlkodm9pZCwgZ2xTdGVuY2lsRnVuYywgR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spCitHTF9FTlRSWSh2b2lkLCBnbFN0ZW5jaWxPcCwgR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKQorR0xfRU5UUlkodm9pZCwgZ2xTY2lzc29yLCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkKK0dMX0VOVFJZKHZvaWQsIGdsSGludCwgR0xlbnVtLCBHTGVudW0gbW9kZSkKK0dMX0VOVFJZKHZvaWQsIGdsTGluZVdpZHRoLCBHTGZsb2F0IHdpZHRoKQorR0xfRU5UUlkodm9pZCwgZ2xMaW5lV2lkdGh4LCBHTGZpeGVkIHdpZHRoKQorR0xfRU5UUlkodm9pZCwgZ2xTaGFkZU1vZGVsLCBHTGVudW0pCitHTF9FTlRSWSh2b2lkLCBnbExpZ2h0TW9kZWxmLCBHTGVudW0sIEdMZmxvYXQpCitHTF9FTlRSWSh2b2lkLCBnbExpZ2h0TW9kZWxmdiwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopCitHTF9FTlRSWSh2b2lkLCBnbExpZ2h0TW9kZWx4LCBHTGVudW0sIEdMZml4ZWQpCitHTF9FTlRSWSh2b2lkLCBnbExpZ2h0TW9kZWx4diwgR0xlbnVtLCBjb25zdCBHTGZpeGVkICopCitHTF9FTlRSWSh2b2lkLCBnbExpZ2h0ZiwgR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQpCitHTF9FTlRSWSh2b2lkLCBnbExpZ2h0ZnYsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopCitHTF9FTlRSWSh2b2lkLCBnbExpZ2h0eCwgR0xlbnVtLCBHTGVudW0sIEdMZml4ZWQpCitHTF9FTlRSWSh2b2lkLCBnbExpZ2h0eHYsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZpeGVkICopCitHTF9FTlRSWSh2b2lkLCBnbE1hdGVyaWFsZiwgR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQpCitHTF9FTlRSWSh2b2lkLCBnbE1hdGVyaWFsZnYsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopCitHTF9FTlRSWSh2b2lkLCBnbE1hdGVyaWFseCwgR0xlbnVtLCBHTGVudW0sIEdMZml4ZWQpCitHTF9FTlRSWSh2b2lkLCBnbE1hdGVyaWFseHYsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZpeGVkICopCitHTF9FTlRSWSh2b2lkLCBnbEZvZ2YsIEdMZW51bSwgR0xmbG9hdCkKK0dMX0VOVFJZKHZvaWQsIGdsRm9nZnYsIEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKQorR0xfRU5UUlkodm9pZCwgZ2xGb2d4LCBHTGVudW0sIEdMZml4ZWQpCitHTF9FTlRSWSh2b2lkLCBnbEZvZ3h2LCBHTGVudW0sIGNvbnN0IEdMZml4ZWQgKikKK0dMX0VOVFJZKHZvaWQsIGdsVmVydGV4UG9pbnRlciwgR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopCitHTF9FTlRSWSh2b2lkLCBnbENvbG9yUG9pbnRlciwgR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopCitHTF9FTlRSWSh2b2lkLCBnbE5vcm1hbFBvaW50ZXIsIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopCitHTF9FTlRSWSh2b2lkLCBnbFRleENvb3JkUG9pbnRlciwgR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopCitHTF9FTlRSWSh2b2lkLCBnbEVuYWJsZUNsaWVudFN0YXRlLCBHTGVudW0pCitHTF9FTlRSWSh2b2lkLCBnbERpc2FibGVDbGllbnRTdGF0ZSwgR0xlbnVtKQorR0xfRU5UUlkodm9pZCwgZ2xDbGllbnRBY3RpdmVUZXh0dXJlLCBHTGVudW0pCitHTF9FTlRSWSh2b2lkLCBnbERyYXdBcnJheXMsIEdMZW51bSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkpCitHTF9FTlRSWSh2b2lkLCBnbERyYXdFbGVtZW50cywgR0xlbnVtLCBHTHNpemVpLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKQorR0xfRU5UUlkodm9pZCwgZ2xMb2FkSWRlbnRpdHksIHZvaWQpCitHTF9FTlRSWSh2b2lkLCBnbExvYWRNYXRyaXhmLCBjb25zdCBHTGZsb2F0KikKK0dMX0VOVFJZKHZvaWQsIGdsTG9hZE1hdHJpeHgsIGNvbnN0IEdMZml4ZWQqKQorR0xfRU5UUlkodm9pZCwgZ2xNYXRyaXhNb2RlLCBHTGVudW0gbW9kZSkKK0dMX0VOVFJZKHZvaWQsIGdsTXVsdE1hdHJpeGYsIGNvbnN0IEdMZmxvYXQqKQorR0xfRU5UUlkodm9pZCwgZ2xNdWx0TWF0cml4eCwgY29uc3QgR0xmaXhlZCopCitHTF9FTlRSWSh2b2lkLCBnbFBvcE1hdHJpeCwgdm9pZCkKK0dMX0VOVFJZKHZvaWQsIGdsUHVzaE1hdHJpeCwgdm9pZCkKK0dMX0VOVFJZKHZvaWQsIGdsRnJ1c3R1bWYsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpCitHTF9FTlRSWSh2b2lkLCBnbEZydXN0dW14LCBHTGZpeGVkLCBHTGZpeGVkLCBHTGZpeGVkLCBHTGZpeGVkLCBHTGZpeGVkLCBHTGZpeGVkKQorR0xfRU5UUlkodm9pZCwgZ2xPcnRob2YsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpCitHTF9FTlRSWSh2b2lkLCBnbE9ydGhveCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCkKK0dMX0VOVFJZKHZvaWQsIGdsUm90YXRlZiwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCkKK0dMX0VOVFJZKHZvaWQsIGdsUm90YXRleCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCkKK0dMX0VOVFJZKHZvaWQsIGdsU2NhbGVmLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KQorR0xfRU5UUlkodm9pZCwgZ2xTY2FsZXgsIEdMZml4ZWQsIEdMZml4ZWQsIEdMZml4ZWQpCitHTF9FTlRSWSh2b2lkLCBnbFRyYW5zbGF0ZWYsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpCitHTF9FTlRSWSh2b2lkLCBnbFRyYW5zbGF0ZXgsIEdMZml4ZWQsIEdMZml4ZWQsIEdMZml4ZWQpCitHTF9FTlRSWSh2b2lkLCBnbFZpZXdwb3J0LCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWkpCitHTF9FTlRSWSh2b2lkLCBnbEFjdGl2ZVRleHR1cmUsIEdMZW51bSkKK0dMX0VOVFJZKHZvaWQsIGdsQmluZFRleHR1cmUsIEdMZW51bSwgR0x1aW50KQorR0xfRU5UUlkodm9pZCwgZ2xHZW5UZXh0dXJlcywgR0xzaXplaSwgR0x1aW50KikKK0dMX0VOVFJZKHZvaWQsIGdsRGVsZXRlVGV4dHVyZXMsIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICopCitHTF9FTlRSWSh2b2lkLCBnbE11bHRpVGV4Q29vcmQ0ZiwgR0xlbnVtLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KQorR0xfRU5UUlkodm9pZCwgZ2xNdWx0aVRleENvb3JkNHgsIEdMZW51bSwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCkKK0dMX0VOVFJZKHZvaWQsIGdsUGl4ZWxTdG9yZWksIEdMZW51bSwgR0xpbnQpCitHTF9FTlRSWSh2b2lkLCBnbFRleEVudmYsIEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0KQorR0xfRU5UUlkodm9pZCwgZ2xUZXhFbnZmdiwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMZmxvYXQqKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhFbnZ4LCBHTGVudW0sIEdMZW51bSwgR0xmaXhlZCkKK0dMX0VOVFJZKHZvaWQsIGdsVGV4RW52eHYsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZpeGVkKikKK0dMX0VOVFJZKHZvaWQsIGdsVGV4UGFyYW1ldGVyZiwgR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQpCitHTF9FTlRSWSh2b2lkLCBnbFRleFBhcmFtZXRlcngsIEdMZW51bSwgR0xlbnVtLCBHTGZpeGVkKQorR0xfRU5UUlkodm9pZCwgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCwgICAgR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBHTGludCwgR0xzaXplaSwgY29uc3QgR0x2b2lkKikKK0dMX0VOVFJZKHZvaWQsIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQsIEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQqKQorR0xfRU5UUlkodm9pZCwgZ2xDb3B5VGV4SW1hZ2UyRCwgR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMaW50KQorR0xfRU5UUlkodm9pZCwgZ2xDb3B5VGV4U3ViSW1hZ2UyRCwgR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWkpCitHTF9FTlRSWSh2b2lkLCBnbFRleEltYWdlMkQsIEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTHNpemVpLCBHTGludCwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCopCitHTF9FTlRSWSh2b2lkLCBnbFRleFN1YkltYWdlMkQsIEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCopCitHTF9FTlRSWSh2b2lkLCBnbFJlYWRQaXhlbHMsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIEdMdm9pZCAqKQorCisvLyAxLjEgYWRkaXRpb25zCitHTF9FTlRSWSh2b2lkLCBnbENsaXBQbGFuZWYsIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCopCitHTF9FTlRSWSh2b2lkLCBnbENsaXBQbGFuZXgsIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCopCitHTF9FTlRSWSh2b2lkLCBnbEJpbmRCdWZmZXIsIEdMZW51bSwgR0x1aW50KQorR0xfRU5UUlkodm9pZCwgZ2xCdWZmZXJEYXRhLCBHTGVudW0sIEdMc2l6ZWlwdHIsIGNvbnN0IEdMdm9pZCosIEdMZW51bSkKK0dMX0VOVFJZKHZvaWQsIGdsQnVmZmVyU3ViRGF0YSwgR0xlbnVtLCBHTGludHB0ciwgR0xzaXplaXB0ciwgY29uc3QgR0x2b2lkKikKK0dMX0VOVFJZKHZvaWQsIGdsRGVsZXRlQnVmZmVycywgR0xzaXplaSwgY29uc3QgR0x1aW50KikKK0dMX0VOVFJZKHZvaWQsIGdsR2VuQnVmZmVycywgR0xzaXplaSwgR0x1aW50KikKK0dMX0VOVFJZKHZvaWQsIGdsR2V0Qm9vbGVhbnYsIEdMZW51bSwgR0xib29sZWFuICopCitHTF9FTlRSWSh2b2lkLCBnbEdldEZpeGVkdiwgR0xlbnVtLCBHTGZpeGVkICopCitHTF9FTlRSWSh2b2lkLCBnbEdldEZsb2F0diwgR0xlbnVtLCBHTGZsb2F0ICopCitHTF9FTlRSWSh2b2lkLCBnbEdldFBvaW50ZXJ2LCBHTGVudW0sIHZvaWQgKiopCitHTF9FTlRSWSh2b2lkLCBnbEdldEJ1ZmZlclBhcmFtZXRlcml2LCBHTGVudW0sIEdMZW51bSwgR0xpbnQgKikKK0dMX0VOVFJZKHZvaWQsIGdsR2V0Q2xpcFBsYW5lZiwgR0xlbnVtLCBHTGZsb2F0WzRdKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRDbGlwUGxhbmV4LCBHTGVudW0sIEdMZml4ZWRbNF0pCitHTF9FTlRSWSh2b2lkLCBnbEdldExpZ2h0eHYsIEdMZW51bSwgR0xlbnVtLCBHTGZpeGVkICopCitHTF9FTlRSWSh2b2lkLCBnbEdldExpZ2h0ZnYsIEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopCitHTF9FTlRSWSh2b2lkLCBnbEdldE1hdGVyaWFseHYsIEdMZW51bSwgR0xlbnVtLCBHTGZpeGVkICopCitHTF9FTlRSWSh2b2lkLCBnbEdldE1hdGVyaWFsZnYsIEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopCitHTF9FTlRSWSh2b2lkLCBnbEdldFRleEVudmZ2LCBHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhFbnZpdiwgR0xlbnVtLCBHTGVudW0sIEdMaW50ICopCitHTF9FTlRSWSh2b2lkLCBnbEdldFRleEVudnh2LCBHTGVudW0sIEdMZW51bSwgR0xmaXhlZCAqKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhQYXJhbWV0ZXJmdiwgR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQgKikKK0dMX0VOVFJZKHZvaWQsIGdsR2V0VGV4UGFyYW1ldGVyaXYsIEdMZW51bSwgR0xlbnVtLCBHTGludCAqKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhQYXJhbWV0ZXJ4diwgR0xlbnVtLCBHTGVudW0sIEdMZml4ZWQgKikKK0dMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc0J1ZmZlciwgR0x1aW50KQorR0xfRU5UUlkoR0xib29sZWFuLCBnbElzRW5hYmxlZCwgR0xlbnVtKQorR0xfRU5UUlkoR0xib29sZWFuLCBnbElzVGV4dHVyZSwgR0x1aW50KQorR0xfRU5UUlkodm9pZCwgZ2xQb2ludFBhcmFtZXRlcmYsIEdMZW51bSwgR0xmbG9hdCkKK0dMX0VOVFJZKHZvaWQsIGdsUG9pbnRQYXJhbWV0ZXJmdiwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopCitHTF9FTlRSWSh2b2lkLCBnbFBvaW50UGFyYW1ldGVyeCwgR0xlbnVtLCBHTGZpeGVkKQorR0xfRU5UUlkodm9pZCwgZ2xQb2ludFBhcmFtZXRlcnh2LCBHTGVudW0sIGNvbnN0IEdMZml4ZWQgKikKK0dMX0VOVFJZKHZvaWQsIGdsQ29sb3I0dWIsIEdMdWJ5dGUsIEdMdWJ5dGUsIEdMdWJ5dGUsIEdMdWJ5dGUpCitHTF9FTlRSWSh2b2lkLCBnbFRleEVudmksIEdMZW51bSwgR0xlbnVtLCBHTGludCkKK0dMX0VOVFJZKHZvaWQsIGdsVGV4RW52aXYsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGludCAqKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhQYXJhbWV0ZXJmdiwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMZmxvYXQgKikKK0dMX0VOVFJZKHZvaWQsIGdsVGV4UGFyYW1ldGVyaXYsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGludCAqKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhQYXJhbWV0ZXJpLCBHTGVudW0sIEdMZW51bSwgR0xpbnQpCitHTF9FTlRSWSh2b2lkLCBnbFRleFBhcmFtZXRlcnh2LCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0xmaXhlZCAqKQorR0xfRU5UUlkodm9pZCwgZ2xQb2ludFNpemVQb2ludGVyT0VTLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCopCisKKy8vIEV4dGVuc2lvbnMKK0dMX0VOVFJZKHZvaWQsIGdsRHJhd1RleHNPRVMsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpCitHTF9FTlRSWSh2b2lkLCBnbERyYXdUZXhpT0VTLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQpCitHTF9FTlRSWSh2b2lkLCBnbERyYXdUZXhmT0VTLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KQorR0xfRU5UUlkodm9pZCwgZ2xEcmF3VGV4eE9FUywgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCwgR0xmaXhlZCkKK0dMX0VOVFJZKHZvaWQsIGdsRHJhd1RleHN2T0VTLCBjb25zdCBHTHNob3J0KikKK0dMX0VOVFJZKHZvaWQsIGdsRHJhd1RleGl2T0VTLCBjb25zdCBHTGludCopCitHTF9FTlRSWSh2b2lkLCBnbERyYXdUZXhmdk9FUywgY29uc3QgR0xmbG9hdCopCitHTF9FTlRSWSh2b2lkLCBnbERyYXdUZXh4dk9FUywgY29uc3QgR0xmaXhlZCopCitHTF9FTlRSWShHTGJpdGZpZWxkLCBnbFF1ZXJ5TWF0cml4eE9FUywgR0xmaXhlZCogbWFudGlzc2EsIEdMaW50KiBleHBvbmVudCkKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvZ2xfZW51bXMuaW4gYi9vcGVuZ2wvbGlicy9nbF9lbnVtcy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmMyZmFkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL2xpYnMvZ2xfZW51bXMuaW4KQEAgLTAsMCArMSwyNjEgQEAKK0dMRU5VTShHTF9QT0lOVFMsIDB4MDAwMCkKK0dMRU5VTShHTF9MSU5FUywgMHgwMDAxKQorR0xFTlVNKEdMX0xJTkVfTE9PUCwgMHgwMDAyKQorR0xFTlVNKEdMX0xJTkVfU1RSSVAsIDB4MDAwMykKK0dMRU5VTShHTF9UUklBTkdMRVMsIDB4MDAwNCkKK0dMRU5VTShHTF9UUklBTkdMRV9TVFJJUCwgMHgwMDA1KQorR0xFTlVNKEdMX1RSSUFOR0xFX0ZBTiwgMHgwMDA2KQorR0xFTlVNKEdMX0FERCwgMHgwMTA0KQorR0xFTlVNKEdMX05FVkVSLCAweDAyMDApCitHTEVOVU0oR0xfTEVTUywgMHgwMjAxKQorR0xFTlVNKEdMX0VRVUFMLCAweDAyMDIpCitHTEVOVU0oR0xfTEVRVUFMLCAweDAyMDMpCitHTEVOVU0oR0xfR1JFQVRFUiwgMHgwMjA0KQorR0xFTlVNKEdMX05PVEVRVUFMLCAweDAyMDUpCitHTEVOVU0oR0xfR0VRVUFMLCAweDAyMDYpCitHTEVOVU0oR0xfQUxXQVlTLCAweDAyMDcpCitHTEVOVU0oR0xfU1JDX0NPTE9SLCAweDAzMDApCitHTEVOVU0oR0xfT05FX01JTlVTX1NSQ19DT0xPUiwgMHgwMzAxKQorR0xFTlVNKEdMX1NSQ19BTFBIQSwgMHgwMzAyKQorR0xFTlVNKEdMX09ORV9NSU5VU19TUkNfQUxQSEEsIDB4MDMwMykKK0dMRU5VTShHTF9EU1RfQUxQSEEsIDB4MDMwNCkKK0dMRU5VTShHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCAweDAzMDUpCitHTEVOVU0oR0xfRFNUX0NPTE9SLCAweDAzMDYpCitHTEVOVU0oR0xfT05FX01JTlVTX0RTVF9DT0xPUiwgMHgwMzA3KQorR0xFTlVNKEdMX1NSQ19BTFBIQV9TQVRVUkFURSwgMHgwMzA4KQorR0xFTlVNKEdMX0ZST05ULCAweDA0MDQpCitHTEVOVU0oR0xfQkFDSywgMHgwNDA1KQorR0xFTlVNKEdMX0ZST05UX0FORF9CQUNLLCAweDA0MDgpCitHTEVOVU0oR0xfSU5WQUxJRF9FTlVNLCAweDA1MDApCitHTEVOVU0oR0xfSU5WQUxJRF9WQUxVRSwgMHgwNTAxKQorR0xFTlVNKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAweDA1MDIpCitHTEVOVU0oR0xfU1RBQ0tfT1ZFUkZMT1csIDB4MDUwMykKK0dMRU5VTShHTF9TVEFDS19VTkRFUkZMT1csIDB4MDUwNCkKK0dMRU5VTShHTF9PVVRfT0ZfTUVNT1JZLCAweDA1MDUpCitHTEVOVU0oR0xfRVhQLCAweDA4MDApCitHTEVOVU0oR0xfRVhQMiwgMHgwODAxKQorR0xFTlVNKEdMX0NXLCAweDA5MDApCitHTEVOVU0oR0xfQ0NXLCAweDA5MDEpCitHTEVOVU0oR0xfUE9JTlRfU01PT1RILCAweDBCMTApCitHTEVOVU0oR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0UsIDB4MEIxMikKK0dMRU5VTShHTF9MSU5FX1NNT09USCwgMHgwQjIwKQorR0xFTlVNKEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFLCAweDBCMjIpCitHTEVOVU0oR0xfQ1VMTF9GQUNFLCAweDBCNDQpCitHTEVOVU0oR0xfTElHSFRJTkcsIDB4MEI1MCkKK0dMRU5VTShHTF9MSUdIVF9NT0RFTF9UV09fU0lERSwgMHgwQjUyKQorR0xFTlVNKEdMX0xJR0hUX01PREVMX0FNQklFTlQsIDB4MEI1MykKK0dMRU5VTShHTF9DT0xPUl9NQVRFUklBTCwgMHgwQjU3KQorR0xFTlVNKEdMX0ZPRywgMHgwQjYwKQorR0xFTlVNKEdMX0ZPR19ERU5TSVRZLCAweDBCNjIpCitHTEVOVU0oR0xfRk9HX1NUQVJULCAweDBCNjMpCitHTEVOVU0oR0xfRk9HX0VORCwgMHgwQjY0KQorR0xFTlVNKEdMX0ZPR19NT0RFLCAweDBCNjUpCitHTEVOVU0oR0xfRk9HX0NPTE9SLCAweDBCNjYpCitHTEVOVU0oR0xfREVQVEhfVEVTVCwgMHgwQjcxKQorR0xFTlVNKEdMX1NURU5DSUxfVEVTVCwgMHgwQjkwKQorR0xFTlVNKEdMX05PUk1BTElaRSwgMHgwQkExKQorR0xFTlVNKEdMX0FMUEhBX1RFU1QsIDB4MEJDMCkKK0dMRU5VTShHTF9ESVRIRVIsIDB4MEJEMCkKK0dMRU5VTShHTF9CTEVORCwgMHgwQkUyKQorR0xFTlVNKEdMX0NPTE9SX0xPR0lDX09QLCAweDBCRjIpCitHTEVOVU0oR0xfU0NJU1NPUl9URVNULCAweDBDMTEpCitHTEVOVU0oR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCAweDBDNTApCitHTEVOVU0oR0xfUE9JTlRfU01PT1RIX0hJTlQsIDB4MEM1MSkKK0dMRU5VTShHTF9MSU5FX1NNT09USF9ISU5ULCAweDBDNTIpCitHTEVOVU0oR0xfUE9MWUdPTl9TTU9PVEhfSElOVCwgMHgwQzUzKQorR0xFTlVNKEdMX0ZPR19ISU5ULCAweDBDNTQpCitHTEVOVU0oR0xfVU5QQUNLX0FMSUdOTUVOVCwgMHgwQ0Y1KQorR0xFTlVNKEdMX1BBQ0tfQUxJR05NRU5ULCAweDBEMDUpCitHTEVOVU0oR0xfTUFYX0xJR0hUUywgMHgwRDMxKQorR0xFTlVNKEdMX01BWF9DTElQX1BMQU5FUywgMHgwRDMyKQorR0xFTlVNKEdMX01BWF9URVhUVVJFX1NJWkUsIDB4MEQzMykKK0dMRU5VTShHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRILCAweDBEMzYpCitHTEVOVU0oR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEgsIDB4MEQzOCkKK0dMRU5VTShHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCwgMHgwRDM5KQorR0xFTlVNKEdMX01BWF9WSUVXUE9SVF9ESU1TLCAweDBEM0EpCitHTEVOVU0oR0xfUkVEX0JJVFMsIDB4MEQ1MikKK0dMRU5VTShHTF9HUkVFTl9CSVRTLCAweDBENTMpCitHTEVOVU0oR0xfQkxVRV9CSVRTLCAweDBENTQpCitHTEVOVU0oR0xfQUxQSEFfQklUUywgMHgwRDU1KQorR0xFTlVNKEdMX0RFUFRIX0JJVFMsIDB4MEQ1NikKK0dMRU5VTShHTF9TVEVOQ0lMX0JJVFMsIDB4MEQ1NykKK0dMRU5VTShHTF9URVhUVVJFXzJELCAweDBERTEpCitHTEVOVU0oR0xfRE9OVF9DQVJFLCAweDExMDApCitHTEVOVU0oR0xfRkFTVEVTVCwgMHgxMTAxKQorR0xFTlVNKEdMX05JQ0VTVCwgMHgxMTAyKQorR0xFTlVNKEdMX0FNQklFTlQsIDB4MTIwMCkKK0dMRU5VTShHTF9ESUZGVVNFLCAweDEyMDEpCitHTEVOVU0oR0xfU1BFQ1VMQVIsIDB4MTIwMikKK0dMRU5VTShHTF9QT1NJVElPTiwgMHgxMjAzKQorR0xFTlVNKEdMX1NQT1RfRElSRUNUSU9OLCAweDEyMDQpCitHTEVOVU0oR0xfU1BPVF9FWFBPTkVOVCwgMHgxMjA1KQorR0xFTlVNKEdMX1NQT1RfQ1VUT0ZGLCAweDEyMDYpCitHTEVOVU0oR0xfQ09OU1RBTlRfQVRURU5VQVRJT04sIDB4MTIwNykKK0dMRU5VTShHTF9MSU5FQVJfQVRURU5VQVRJT04sIDB4MTIwOCkKK0dMRU5VTShHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04sIDB4MTIwOSkKK0dMRU5VTShHTF9CWVRFLCAweDE0MDApCitHTEVOVU0oR0xfVU5TSUdORURfQllURSwgMHgxNDAxKQorR0xFTlVNKEdMX1NIT1JULCAweDE0MDIpCitHTEVOVU0oR0xfVU5TSUdORURfU0hPUlQsIDB4MTQwMykKK0dMRU5VTShHTF9GTE9BVCwgMHgxNDA2KQorR0xFTlVNKEdMX0ZJWEVELCAweDE0MEMpCitHTEVOVU0oR0xfQ0xFQVIsIDB4MTUwMCkKK0dMRU5VTShHTF9BTkQsIDB4MTUwMSkKK0dMRU5VTShHTF9BTkRfUkVWRVJTRSwgMHgxNTAyKQorR0xFTlVNKEdMX0NPUFksIDB4MTUwMykKK0dMRU5VTShHTF9BTkRfSU5WRVJURUQsIDB4MTUwNCkKK0dMRU5VTShHTF9OT09QLCAweDE1MDUpCitHTEVOVU0oR0xfWE9SLCAweDE1MDYpCitHTEVOVU0oR0xfT1IsIDB4MTUwNykKK0dMRU5VTShHTF9OT1IsIDB4MTUwOCkKK0dMRU5VTShHTF9FUVVJViwgMHgxNTA5KQorR0xFTlVNKEdMX0lOVkVSVCwgMHgxNTBBKQorR0xFTlVNKEdMX09SX1JFVkVSU0UsIDB4MTUwQikKK0dMRU5VTShHTF9DT1BZX0lOVkVSVEVELCAweDE1MEMpCitHTEVOVU0oR0xfT1JfSU5WRVJURUQsIDB4MTUwRCkKK0dMRU5VTShHTF9OQU5ELCAweDE1MEUpCitHTEVOVU0oR0xfU0VULCAweDE1MEYpCitHTEVOVU0oR0xfRU1JU1NJT04sIDB4MTYwMCkKK0dMRU5VTShHTF9TSElOSU5FU1MsIDB4MTYwMSkKK0dMRU5VTShHTF9BTUJJRU5UX0FORF9ESUZGVVNFLCAweDE2MDIpCitHTEVOVU0oR0xfTU9ERUxWSUVXLCAweDE3MDApCitHTEVOVU0oR0xfUFJPSkVDVElPTiwgMHgxNzAxKQorR0xFTlVNKEdMX1RFWFRVUkUsIDB4MTcwMikKK0dMRU5VTShHTF9BTFBIQSwgMHgxOTA2KQorR0xFTlVNKEdMX1JHQiwgMHgxOTA3KQorR0xFTlVNKEdMX1JHQkEsIDB4MTkwOCkKK0dMRU5VTShHTF9MVU1JTkFOQ0UsIDB4MTkwOSkKK0dMRU5VTShHTF9MVU1JTkFOQ0VfQUxQSEEsIDB4MTkwQSkKK0dMRU5VTShHTF9GTEFULCAweDFEMDApCitHTEVOVU0oR0xfU01PT1RILCAweDFEMDEpCitHTEVOVU0oR0xfS0VFUCwgMHgxRTAwKQorR0xFTlVNKEdMX1JFUExBQ0UsIDB4MUUwMSkKK0dMRU5VTShHTF9SRVBMQUNFLCAweDFFMDEpCitHTEVOVU0oR0xfSU5DUiwgMHgxRTAyKQorR0xFTlVNKEdMX0RFQ1IsIDB4MUUwMykKK0dMRU5VTShHTF9WRU5ET1IsIDB4MUYwMCkKK0dMRU5VTShHTF9SRU5ERVJFUiwgMHgxRjAxKQorR0xFTlVNKEdMX1ZFUlNJT04sIDB4MUYwMikKK0dMRU5VTShHTF9FWFRFTlNJT05TLCAweDFGMDMpCitHTEVOVU0oR0xfTU9EVUxBVEUsIDB4MjEwMCkKK0dMRU5VTShHTF9ERUNBTCwgMHgyMTAxKQorR0xFTlVNKEdMX1RFWFRVUkVfRU5WX01PREUsIDB4MjIwMCkKK0dMRU5VTShHTF9URVhUVVJFX0VOVl9DT0xPUiwgMHgyMjAxKQorR0xFTlVNKEdMX1RFWFRVUkVfRU5WLCAweDIzMDApCitHTEVOVU0oR0xfTkVBUkVTVCwgMHgyNjAwKQorR0xFTlVNKEdMX0xJTkVBUiwgMHgyNjAxKQorR0xFTlVNKEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QsIDB4MjcwMCkKK0dMRU5VTShHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QsIDB4MjcwMSkKK0dMRU5VTShHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIsIDB4MjcwMikKK0dMRU5VTShHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiwgMHgyNzAzKQorR0xFTlVNKEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgMHgyODAwKQorR0xFTlVNKEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgMHgyODAxKQorR0xFTlVNKEdMX1RFWFRVUkVfV1JBUF9TLCAweDI4MDIpCitHTEVOVU0oR0xfVEVYVFVSRV9XUkFQX1QsIDB4MjgwMykKK0dMRU5VTShHTF9DTEFNUCwgMHgyOTAwKQorR0xFTlVNKEdMX1JFUEVBVCwgMHgyOTAxKQorR0xFTlVNKEdMX0NMSVBfUExBTkUwLCAweDMwMDApCitHTEVOVU0oR0xfQ0xJUF9QTEFORTEsIDB4MzAwMSkKK0dMRU5VTShHTF9DTElQX1BMQU5FMiwgMHgzMDAyKQorR0xFTlVNKEdMX0NMSVBfUExBTkUzLCAweDMwMDMpCitHTEVOVU0oR0xfQ0xJUF9QTEFORTQsIDB4MzAwNCkKK0dMRU5VTShHTF9DTElQX1BMQU5FNSwgMHgzMDA1KQorR0xFTlVNKEdMX0xJR0hUMCwgMHg0MDAwKQorR0xFTlVNKEdMX0xJR0hUMSwgMHg0MDAxKQorR0xFTlVNKEdMX0xJR0hUMiwgMHg0MDAyKQorR0xFTlVNKEdMX0xJR0hUMywgMHg0MDAzKQorR0xFTlVNKEdMX0xJR0hUNCwgMHg0MDA0KQorR0xFTlVNKEdMX0xJR0hUNSwgMHg0MDA1KQorR0xFTlVNKEdMX0xJR0hUNiwgMHg0MDA2KQorR0xFTlVNKEdMX0xJR0hUNywgMHg0MDA3KQorR0xFTlVNKEdMX0RJUkVDVF9URVhUVVJFXzJEX1FVQUxDT01NLCAweDdFODApCitHTEVOVU0oR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCwgMHg4MDMzKQorR0xFTlVNKEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEsIDB4ODAzNCkKK0dMRU5VTShHTF9QT0xZR09OX09GRlNFVF9GSUxMLCAweDgwMzcpCitHTEVOVU0oR0xfUkVTQ0FMRV9OT1JNQUwsIDB4ODAzQSkKK0dMRU5VTShHTF9WRVJURVhfQVJSQVksIDB4ODA3NCkKK0dMRU5VTShHTF9OT1JNQUxfQVJSQVksIDB4ODA3NSkKK0dMRU5VTShHTF9DT0xPUl9BUlJBWSwgMHg4MDc2KQorR0xFTlVNKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVksIDB4ODA3OCkKK0dMRU5VTShHTF9NVUxUSVNBTVBMRSwgMHg4MDlEKQorR0xFTlVNKEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSwgMHg4MDlFKQorR0xFTlVNKEdMX1NBTVBMRV9BTFBIQV9UT19PTkUsIDB4ODA5RikKK0dMRU5VTShHTF9TQU1QTEVfQ09WRVJBR0UsIDB4ODBBMCkKK0dMRU5VTShHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMsIDB4ODBFOCkKK0dMRU5VTShHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUywgMHg4MEU5KQorR0xFTlVNKEdMX0NMQU1QX1RPX0VER0UsIDB4ODEyRikKK0dMRU5VTShHTF9HRU5FUkFURV9NSVBNQVAsIDB4ODE5MSkKK0dMRU5VTShHTF9HRU5FUkFURV9NSVBNQVBfSElOVCwgMHg4MTkyKQorR0xFTlVNKEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCAweDgzNjMpCitHTEVOVU0oR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFLCAweDg0NkQpCitHTEVOVU0oR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFLCAweDg0NkUpCitHTEVOVU0oR0xfVEVYVFVSRTAsIDB4ODRDMCkKK0dMRU5VTShHTF9URVhUVVJFMSwgMHg4NEMxKQorR0xFTlVNKEdMX1RFWFRVUkUyLCAweDg0QzIpCitHTEVOVU0oR0xfVEVYVFVSRTMsIDB4ODRDMykKK0dMRU5VTShHTF9URVhUVVJFNCwgMHg4NEM0KQorR0xFTlVNKEdMX1RFWFRVUkU1LCAweDg0QzUpCitHTEVOVU0oR0xfVEVYVFVSRTYsIDB4ODRDNikKK0dMRU5VTShHTF9URVhUVVJFNywgMHg4NEM3KQorR0xFTlVNKEdMX1RFWFRVUkU4LCAweDg0QzgpCitHTEVOVU0oR0xfVEVYVFVSRTksIDB4ODRDOSkKK0dMRU5VTShHTF9URVhUVVJFMTAsIDB4ODRDQSkKK0dMRU5VTShHTF9URVhUVVJFMTEsIDB4ODRDQikKK0dMRU5VTShHTF9URVhUVVJFMTIsIDB4ODRDQykKK0dMRU5VTShHTF9URVhUVVJFMTMsIDB4ODRDRCkKK0dMRU5VTShHTF9URVhUVVJFMTQsIDB4ODRDRSkKK0dMRU5VTShHTF9URVhUVVJFMTUsIDB4ODRDRikKK0dMRU5VTShHTF9URVhUVVJFMTYsIDB4ODREMCkKK0dMRU5VTShHTF9URVhUVVJFMTcsIDB4ODREMSkKK0dMRU5VTShHTF9URVhUVVJFMTgsIDB4ODREMikKK0dMRU5VTShHTF9URVhUVVJFMTksIDB4ODREMykKK0dMRU5VTShHTF9URVhUVVJFMjAsIDB4ODRENCkKK0dMRU5VTShHTF9URVhUVVJFMjEsIDB4ODRENSkKK0dMRU5VTShHTF9URVhUVVJFMjIsIDB4ODRENikKK0dMRU5VTShHTF9URVhUVVJFMjMsIDB4ODRENykKK0dMRU5VTShHTF9URVhUVVJFMjQsIDB4ODREOCkKK0dMRU5VTShHTF9URVhUVVJFMjUsIDB4ODREOSkKK0dMRU5VTShHTF9URVhUVVJFMjYsIDB4ODREQSkKK0dMRU5VTShHTF9URVhUVVJFMjcsIDB4ODREQikKK0dMRU5VTShHTF9URVhUVVJFMjgsIDB4ODREQykKK0dMRU5VTShHTF9URVhUVVJFMjksIDB4ODRERCkKK0dMRU5VTShHTF9URVhUVVJFMzAsIDB4ODRERSkKK0dMRU5VTShHTF9URVhUVVJFMzEsIDB4ODRERikKK0dMRU5VTShHTF9NQVhfVEVYVFVSRV9VTklUUywgMHg4NEUyKQorR0xFTlVNKEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUywgMHg4NkEyKQorR0xFTlVNKEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTLCAweDg2QTMpCitHTEVOVU0oR0xfQlVGRkVSX1NJWkUsIDB4ODc2NCkKK0dMRU5VTShHTF9CVUZGRVJfVVNBR0UsIDB4ODc2NSkKK0dMRU5VTShHTF9QT0lOVF9TUFJJVEVfT0VTLCAweDg4NjEpCitHTEVOVU0oR0xfQ09PUkRfUkVQTEFDRV9PRVMsIDB4ODg2MikKK0dMRU5VTShHTF9BUlJBWV9CVUZGRVIsIDB4ODg5MikKK0dMRU5VTShHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgMHg4ODkzKQorR0xFTlVNKEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HLCAweDg4OTQpCitHTEVOVU0oR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORywgMHg4ODk1KQorR0xFTlVNKEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORywgMHg4ODk2KQorR0xFTlVNKEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORywgMHg4ODk3KQorR0xFTlVNKEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HLCAweDg4OTgpCitHTEVOVU0oR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORywgMHg4ODlBKQorR0xFTlVNKEdMX1NUQVRJQ19EUkFXLCAweDg4RTQpCitHTEVOVU0oR0xfRFlOQU1JQ19EUkFXLCAweDg4RTgpCitHTEVOVU0oR0xfUE9JTlRfU0laRV9BUlJBWV9UWVBFX09FUywgMHg4OThBKQorR0xFTlVNKEdMX1BPSU5UX1NJWkVfQVJSQVlfU1RSSURFX09FUywgMHg4OThCKQorR0xFTlVNKEdMX1BPSU5UX1NJWkVfQVJSQVlfUE9JTlRFUl9PRVMsIDB4ODk4QykKK0dMRU5VTShHTF9NT0RFTFZJRVdfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUywgMHg4OThEKQorR0xFTlVNKEdMX1BST0pFQ1RJT05fTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUywgMHg4OThFKQorR0xFTlVNKEdMX1RFWFRVUkVfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUywgMHg4OThGKQorR0xFTlVNKEdMX1BBTEVUVEU0X1JHQjhfT0VTLCAweDhCOTApCitHTEVOVU0oR0xfUEFMRVRURTRfUkdCQThfT0VTLCAweDhCOTEpCitHTEVOVU0oR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTLCAweDhCOTIpCitHTEVOVU0oR0xfUEFMRVRURTRfUkdCQTRfT0VTLCAweDhCOTMpCitHTEVOVU0oR0xfUEFMRVRURTRfUkdCNV9BMV9PRVMsIDB4OEI5NCkKK0dMRU5VTShHTF9QQUxFVFRFOF9SR0I4X09FUywgMHg4Qjk1KQorR0xFTlVNKEdMX1BBTEVUVEU4X1JHQkE4X09FUywgMHg4Qjk2KQorR0xFTlVNKEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUywgMHg4Qjk3KQorR0xFTlVNKEdMX1BBTEVUVEU4X1JHQkE0X09FUywgMHg4Qjk4KQorR0xFTlVNKEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTLCAweDhCOTkpCitHTEVOVU0oR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUywgMHg4QjlBKQorR0xFTlVNKEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUX09FUywgMHg4QjlCKQorR0xFTlVNKEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTLCAweDhCOUMpCitHTEVOVU0oR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCAweDhCOUQpCitHTEVOVU0oR0xfUE9JTlRfU0laRV9BUlJBWV9CVUZGRVJfQklORElOR19PRVMsIDB4OEI5RikKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL2dsX2xvZ2dlci5oIGIvb3BlbmdsL2xpYnMvZ2xfbG9nZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4NWRkMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJzL2dsX2xvZ2dlci5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIAorICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICoqCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfR0xfTE9HR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9HTF9MT0dHRVJfSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisjZGVmaW5lIEdMX0VOVFJZKHIsIGFwaSwgLi4uKSByIGxvZ18jI2FwaShfX1ZBX0FSR1NfXyk7CisjaW5jbHVkZSAiZ2xfZW50cmllcy5pbiIKKyN1bmRlZiBHTF9FTlRSWQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qIEFORFJPSURfR0xfTE9HR0VSX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL2hvb2tzLmggYi9vcGVuZ2wvbGlicy9ob29rcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZmIwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvbGlicy9ob29rcy5oCkBAIC0wLDAgKzEsMTM0IEBACisvKiAKKyAqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoqCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqKgorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0dMRVNfQ01fSE9PS1NfSAorI2RlZmluZSBBTkRST0lEX0dMRVNfQ01fSE9PS1NfSAorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworI2RlZmluZSBHTF9MT0dHRVIgICAgICAgICAgICAgICAgICAgMAorI2lmICFkZWZpbmVkKF9fYXJtX18pCisjZGVmaW5lIFVTRV9TTE9XX0JJTkRJTkcgICAgICAgICAgICAxCisjZWxzZQorI2RlZmluZSBVU0VfU0xPV19CSU5ESU5HICAgICAgICAgICAgMAorI2VuZGlmCisjdW5kZWYgTkVMRU0KKyNkZWZpbmUgTkVMRU0oeCkgICAgICAgICAgICAgICAgICAgIChzaXplb2YoeCkvc2l6ZW9mKCooeCkpKQorI2RlZmluZSBNQVhfTlVNQkVSX09GX0dMX0VYVEVOU0lPTlMgMzIKKworCisjaWYgZGVmaW5lZChIQVZFX0FORFJPSURfT1MpICYmICFVU0VfU0xPV19CSU5ESU5HICYmICFHTF9MT0dHRVIgJiYgX19PUFRJTUlaRV9fCisjZGVmaW5lIFVTRV9GQVNUX1RMU19LRVkgICAgICAgICAgICAxCisjZWxzZQorI2RlZmluZSBVU0VfRkFTVF9UTFNfS0VZICAgICAgICAgICAgMAorI2VuZGlmCisKKyNpZiBVU0VfRkFTVF9UTFNfS0VZCisjICAgaW5jbHVkZSA8YmlvbmljX3Rscy5oPiAgLyogc3BlY2lhbCBwcml2YXRlIEMgbGlicmFyeSBoZWFkZXIgKi8KKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vICBFR0xEaXNwbGF5IGFyZSBnbG9iYWwsIG5vdCBhdHRhY2hlZCB0byBhIGdpdmVuIHRocmVhZAorY29uc3QgdW5zaWduZWQgaW50IE5VTV9ESVNQTEFZUyA9IDE7CisKK2VudW0geworICAgIElNUExfSEFSRFdBUkUgPSAwLAorICAgIElNUExfU09GVFdBUkUsCisgICAgSU1QTF9DT05URVhUX0xPU1QsCisgICAgSU1QTF9OT19DT05URVhULAorICAgIAorICAgIElNUExfTlVNX0lNUExFTUVOVEFUSU9OUworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBHTCAvIEVHTCBob29rcworCisjdW5kZWYgR0xfRU5UUlkKKyN1bmRlZiBFR0xfRU5UUlkKKyNkZWZpbmUgR0xfRU5UUlkoX3IsIF9hcGksIC4uLikgX3IgKCpfYXBpKShfX1ZBX0FSR1NfXyk7CisjZGVmaW5lIEVHTF9FTlRSWShfciwgX2FwaSwgLi4uKSBfciAoKl9hcGkpKF9fVkFfQVJHU19fKTsKKworc3RydWN0IGdsX2hvb2tzX3QgeworICAgIHN0cnVjdCBnbF90IHsKKyAgICAgICAgI2luY2x1ZGUgImdsX2VudHJpZXMuaW4iCisgICAgfSBnbDsKKyAgICBzdHJ1Y3QgZWdsX3QgeworICAgICAgICAjaW5jbHVkZSAiZWdsX2VudHJpZXMuaW4iCisgICAgfSBlZ2w7CisgICAgc3RydWN0IGdsX2V4dF90IHsKKyAgICAgICAgdm9pZCAoKmV4dGVuc2lvbnNbTUFYX05VTUJFUl9PRl9HTF9FWFRFTlNJT05TXSkodm9pZCk7CisgICAgfSBleHQ7Cit9OworI3VuZGVmIEdMX0VOVFJZCisjdW5kZWYgRUdMX0VOVFJZCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gZ2xfaG9va3NfdCBnSG9va3NbSU1QTF9OVU1fSU1QTEVNRU5UQVRJT05TXTsKK2V4dGVybiBwdGhyZWFkX2tleV90IGdHTFdyYXBwZXJLZXk7CisKKyNpZiBVU0VfRkFTVF9UTFNfS0VZCisKKy8vIFdlIGhhdmUgYSBkZWRpY2F0ZWQgVExTIHNsb3QgaW4gYmlvbmljCitzdGF0aWMgaW5saW5lIGdsX2hvb2tzX3QgY29uc3QgKiB2b2xhdGlsZSAqIGdldF90bHNfaG9va3MoKSB7CisgICAgdm9sYXRpbGUgdm9pZCAqdGxzX2Jhc2UgPSBfX2dldF90bHMoKTsKKyAgICBnbF9ob29rc190IGNvbnN0ICogdm9sYXRpbGUgKiB0bHNfaG9va3MgPSAKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Z2xfaG9va3NfdCBjb25zdCAqIHZvbGF0aWxlICo+KHRsc19iYXNlKTsKKyAgICByZXR1cm4gdGxzX2hvb2tzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0R2xUaHJlYWRTcGVjaWZpYyhnbF9ob29rc190IGNvbnN0ICp2YWx1ZSkgeworICAgIGdsX2hvb2tzX3QgY29uc3QgKiB2b2xhdGlsZSAqIHRsc19ob29rcyA9IGdldF90bHNfaG9va3MoKTsKKyAgICB0bHNfaG9va3NbVExTX1NMT1RfT1BFTkdMX0FQSV0gPSB2YWx1ZTsKK30KKworc3RhdGljIGdsX2hvb2tzX3QgY29uc3QqIGdldEdsVGhyZWFkU3BlY2lmaWMoKSB7CisgICAgZ2xfaG9va3NfdCBjb25zdCAqIHZvbGF0aWxlICogdGxzX2hvb2tzID0gZ2V0X3Rsc19ob29rcygpOworICAgIGdsX2hvb2tzX3QgY29uc3QqIGhvb2tzID0gdGxzX2hvb2tzW1RMU19TTE9UX09QRU5HTF9BUEldOworICAgIGlmIChob29rcykgcmV0dXJuIGhvb2tzOworICAgIHJldHVybiAmZ0hvb2tzW0lNUExfTk9fQ09OVEVYVF07Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRHbFRocmVhZFNwZWNpZmljKGdsX2hvb2tzX3QgY29uc3QgKnZhbHVlKSB7CisgICAgcHRocmVhZF9zZXRzcGVjaWZpYyhnR0xXcmFwcGVyS2V5LCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBnbF9ob29rc190IGNvbnN0KiBnZXRHbFRocmVhZFNwZWNpZmljKCkgeworICAgIGdsX2hvb2tzX3QgY29uc3QqIGhvb2tzID0gIHN0YXRpY19jYXN0PGdsX2hvb2tzX3QqPihwdGhyZWFkX2dldHNwZWNpZmljKGdHTFdyYXBwZXJLZXkpKTsKKyAgICBpZiAoaG9va3MpIHJldHVybiBob29rczsKKyAgICByZXR1cm4gJmdIb29rc1tJTVBMX05PX0NPTlRFWFRdOworfQorCisjZW5kaWYKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLyogQU5EUk9JRF9HTEVTX0NNX0hPT0tTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL3Rvb2xzL2VudW1leHRyYWN0LnNoIGIvb3BlbmdsL2xpYnMvdG9vbHMvZW51bWV4dHJhY3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwNzMwMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC9saWJzL3Rvb2xzL2VudW1leHRyYWN0LnNoCkBAIC0wLDAgKzEsMzIgQEAKKyMhL2Jpbi9zaAorCithd2sgJworL14jZGVmaW5lIEdMXy8geworICAgIG5hbWVzW2NvdW50XSA9ICQyOworICAgIHZhbHVlc1tjb3VudF0gPSAkMzsKKyAgICBzb3J0W2NvdW50XSA9ICQzICsgMDsKKyAgICBjb3VudCsrOworfQorRU5EIHsKKyAgICBmb3IgKGkgPSAxOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICBpZiAoc29ydFtpXSA8IHNvcnRbal0pIHsKKyAgICAgICAgICAgICAgICB0biA9IG5hbWVzW2ldOworICAgICAgICAgICAgICAgIHR2ID0gdmFsdWVzW2ldOworICAgICAgICAgICAgICAgIHRzID0gc29ydFtpXTsKKyAgICAgICAgICAgICAgICBuYW1lc1tpXSA9IG5hbWVzW2pdOworICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IHZhbHVlc1tqXTsKKyAgICAgICAgICAgICAgICBzb3J0W2ldID0gc29ydFtqXTsKKyAgICAgICAgICAgICAgICBuYW1lc1tqXSA9IHRuOworICAgICAgICAgICAgICAgIHZhbHVlc1tqXSA9IHR2OworICAgICAgICAgICAgICAgIHNvcnRbal0gPSB0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBwcmludGYoIkdMRU5VTSglcywgJXMpXG4iLCBuYW1lc1tpXSwgdmFsdWVzW2ldKTsKKyAgICB9Cit9CisnIDwgJDEKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDUzZTdkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTAsMCArMSBAQAoraW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njk1OGQzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE3IEBACisjIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX1NSQ19GSUxFUzo9IGFwcC1saW51eC5jIGRlbW8uYy5hcm0KK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliRUdMIGxpYkdMRVN2MV9DTSBsaWJ1aQorTE9DQUxfTU9EVUxFOj0gYW5nZWxlcworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTOj0gZ3B1c3RhdGUuYworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJFR0wgbGliR0xFU3YxX0NNCitMT0NBTF9NT0RVTEU6PSBncHVzdGF0ZQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvTU9EVUxFX0xJQ0VOU0VfQlNEX09SX0xHUEwgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9NT0RVTEVfTElDRU5TRV9CU0RfT1JfTEdQTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvTU9EVUxFX0xJQ0VOU0VfQlNEX09SX0xHUEwKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL1JFQURNRS50eHQgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjhhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9SRUFETUUudHh0CkBAIC0wLDAgKzEsNzcgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK1NhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUNCitDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhDQorV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLw0KK1NlZSBmaWxlIGxpY2Vuc2UudHh0IGZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24uDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorVGhpcyBpcyBhbiBPcGVuR0wgRVMgcG9ydCBvZiB0aGUgc21hbGwgc2VsZi1ydW5uaW5nIGRlbW9uc3RyYXRpb24NCitjYWxsZWQgIlNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIiwgd2hpY2ggd2FzIGZpcnN0IHByZXNlbnRlZCBpbiB0aGUNCitBc3NlbWJseScyMDA0IGV2ZW50LiBJdCB3b24gdGhlIGZpcnN0IHBsYWNlIGluIHRoZSA0IEtCIGludHJvDQorY29tcGV0aXRpb24gY2F0ZWdvcnkuDQorDQorVGhlIGRlbW9uc3RyYXRpb24gZmVhdHVyZXMgYSBzaWdodHNlZWluZyBvZiBhIGZ1dHVyaXN0aWMgY2l0eQ0KK2hhdmluZyBtYW55IGRpZmZlcmVudCBraW5kIG9mIGJ1aWxkaW5ncyBhbmQgaXRlbXMuIEV2ZXJ5dGhpbmcgaXMNCitmbGF0IHNoYWRlZCB3aXRoIHRocmVlIGRpZmZlcmVudCBsaWdodHMuDQorDQorVGhlIG9yaWdpbmFsIHZlcnNpb24gd2FzIG1hZGUgZm9yIGRlc2t0b3Agd2l0aCBPcGVuR0wuIEl0IHdhcw0KK25hdHVyYWxseSBoZWF2aWx5IHNpemUgb3B0aW1pemVkIGluIG9yZGVyIHRvIGZpdCBpdCBpbiB0aGUgc2l6ZQ0KK2xpbWl0LiBGb3IgdGhpcyBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlIG11Y2ggb2YgdGhlIGNvZGUgaXMNCitjbGVhbmVkIHVwIGFuZCB0aGUgc291bmQgaXMgcmVtb3ZlZC4gQWxzbyBkZXRhaWwgbGV2ZWwgaXMgbG93ZXJlZCwNCithbHRob3VnaCBpdCBzdGlsbCBjb250YWlucyBvdmVyIDYwMDAwIGZhY2VzLg0KKw0KK1RoZSBXaW4zMiAoMjAwMC9YUCkgYmluYXJ5IHBhY2thZ2Ugb2Ygb3JpZ2luYWwgdmVyc2lvbiBpcw0KK2F2YWlsYWJsZSBmcm9tIHRoaXMgYWRkcmVzczogaHR0cDovL2pldC5yby9maWxlcy9hbmdlbGVzLnppcA0KKw0KK0ZpcnN0IHZlcnNpb24gb2YgdGhpcyBPcGVuR0wgRVMgcG9ydCB3YXMgc3VibWl0dGVkIHRvIHRoZSBLaHJvbm9zDQorT3BlbkdMIEVTIENvZGluZyBDaGFsbGVuZ2UgaGVsZCBpbiAyMDA0LTIwMDUuDQorDQorQXMgYSBjb2RlIGV4YW1wbGUsIHRoaXMgc291cmNlIHNob3dzIHRoZSBmb2xsb3dpbmc6DQorICAqIEhvdyB0byBjcmVhdGUgYSBtaW5pbWFsIGFuZCBwb3J0YWJsZSBhZCBob2MgZnJhbWV3b3JrDQorICAgIGZvciBzbWFsbCB0ZXN0aW5nL2RlbW9uc3RyYXRpb24gcHJvZ3JhbXMuIFRoaXMgZnJhbWV3b3JrDQorICAgIGNvbXBpbGVzIGZvciBib3RoIGRlc2t0b3AgYW5kIFBvY2tldFBDIFdpbjMyIGVudmlyb25tZW50LA0KKyAgICBhbmQgYSBzZXBhcmF0ZSBzb3VyY2UgaXMgaW5jbHVkZWQgZm9yIExpbnV4IHdpdGggWDExLg0KKyAgKiBIb3cgdG8gZHluYW1pY2FsbHkgZmluZCBhbmQgdXNlIHRoZSBPcGVuR0wgRVMgRExMIG9yDQorICAgIHNoYXJlZCBvYmplY3QsIHNvIHRoYXQgdGhlIGxpYnJhcnkgaXMgbm90IG5lZWRlZCBhdA0KKyAgICB0aGUgY29tcGlsZS9saW5rIHN0YWdlLg0KKyAgKiBIb3cgdG8gdXNlIHRoZSBiYXNpYyBmZWF0dXJlcyBvZiBPcGVuR0wgRVMgMS4wLzEuMQ0KKyAgICBDb21tb24gTGl0ZSwgc3VjaCBhcyB2ZXJ0ZXggYXJyYXlzLCBjb2xvciBhcnJheXMgYW5kDQorICAgIGxpZ2h0aW5nLg0KKyAgKiBIb3cgdG8gY3JlYXRlIGEgc2VsZiBjb250YWluZWQgc21hbGwgZGVtb25zdHJhdGlvbg0KKyAgICBhcHBsaWNhdGlvbiB3aXRoIG9iamVjdHMgZ2VuZXJhdGVkIHVzaW5nIHByb2NlZHVyYWwNCisgICAgYWxnb3JpdGhtcy4NCisNCitBcyB0aGUgb3JpZ2luYWwgdmVyc2lvbiB3YXMgb3B0aW1pemVkIGZvciBzaXplIGluc3RlYWQgb2YNCitwZXJmb3JtYW5jZSwgdGhhdCBob2xkcyB0cnVlIGZvciB0aGlzIE9wZW5HTCBFUyB2ZXJzaW9uIGFzDQord2VsbC4gVGh1cyB0aGUgcGVyZm9ybWFuY2UgY291bGQgYmUgc2lnbmlmaWNhbnRseSBpbmNyZWFzZWQsDQorZm9yIGV4YW1wbGUgYnkgY2hhbmdpbmcgdGhlIGNvZGUgdG8gdXNlIGdsRHJhd0VsZW1lbnRzDQoraW5zdGVhZCBvZiBnbERyYXdBcnJheXMuIFRoZSBjb2RlIHVzZXMgb25seSBPcGVuR0wgRVMgMS4wDQorQ29tbW9uIExpdGUgLWxldmVsIGZ1bmN0aW9uIGNhbGxzIHdpdGhvdXQgYW55IGV4dGVuc2lvbnMuDQorDQorVGhlIHJlZmVyZW5jZSBPcGVuR0wgRVMgaW1wbGVtZW50YXRpb25zIHVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb246DQorICAqIEh5YnJpZCdzIE9wZW5HTCBFUyBBUEkgSW1wbGVtZW50YXRpb24gKEdlcmJlcmEpIHZlcnNpb24gMi4wLjQNCisgICAgUHJlYnVpbHQgV2luMzIgUEMgZXhlY3V0YWJsZTogU2FuT0dMRVMtR2VyYmVyYS5leGUNCisgICogUG93ZXJWUiBNQlggU0RLLCBPcGVuR0wgRVMgV2luZG93cyBQQyBFbXVsYXRpb24gdmVyc2lvbiAxLjA0LjE0LjAxNzANCisgICAgUHJlYnVpbHQgV2luMzIgUEMgZXhlY3V0YWJsZTogU2FuT0dMRVMtUFZSU0RLLmV4ZQ0KKw0KK05vdGUgdGhhdCBESVNBQkxFX0lNUE9SVEdMIHByZXByb2Nlc3NvciBtYWNybyBjYW4gYmUgdXNlZA0KK3RvIHNwZWNpZnkgbm90IHRvIHVzZSBkeW5hbWljIHJ1bnRpbWUgYmluZGluZyBvZiB0aGUgbGlicmFyeS4NCitZb3UgYWxzbyBuZWVkIHRvIGRlZmluZSBwcmVwcm9jZXNzb3IgbWFjcm8gUFZSU0RLIHRvIGNvbXBpbGUNCit0aGUgc291cmNlIHdpdGggUG93ZXJWUiBPcGVuR0wgRVMgU0RLLg0KKw0KK1RoZSBkZW1vIGFwcGxpY2F0aW9uIGlzIGJyaWVmbHkgdGVzdGVkIHdpdGggYSBmZXcgb3RoZXIgT3BlbkdMIEVTDQoraW1wbGVtZW50YXRpb25zIGFzIHdlbGwgKGUuZy4gVmluY2VudCwgR0xFU29uR0wgb24gTGludXgsIERlbGwNCitBeGltIFg1MHYpLiBNb3N0IG9mIHRoZXNlIG90aGVyIGltcGxlbWVudGF0aW9ucyByZW5kZXJlZCB0aGUgZGVtbw0KK2Vycm9uZW91c2x5IGluIHNvbWUgYXNwZWN0LiBUaGlzIG1heSBpbmRpY2F0ZSB0aGF0IHRoZSBkZW1vIHNvdXJjZQ0KK2NvdWxkIHN0aWxsIGhhdmUgc29tZSB3b3JrIHRvIGRvIHdpdGggY29tcGF0aWJpbGl0eSBhbmQgY29ycmVjdA0KK0FQSSB1c2FnZSwgYWx0aG91Z2ggdGhlIG5vbi1jb25mb3JtaW5nIGltcGxlbWVudGF0aW9ucyBhcmUgbW9zdA0KK3Byb2JhYmx5IHVuZmluaXNoZWQgYXMgd2VsbC4NCisNCitUaGFua3MgYW5kIEFja25vd2xlZGdlbWVudHM6DQorDQorKiBUb25pIEz2bm5iZXJnICghQ3ViZSkgY3JlYXRlZCB0aGUgbXVzaWMgZm9yIG9yaWdpbmFsIHZlcnNpb24sIHdoaWNoDQorICBpcyBub3QgZmVhdHVyZWQgaW4gdGhpcyBPcGVuR0wgRVMgcG9ydC4NCisqIFNhcmEgS2FwbGkgKHN0IFJhbmEpIGZvciBhZGRpdGlvbmFsIGNhbWVyYSB3b3JrLg0KKyogUGF1bCBCb3Vya2UgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdXBlcnNoYXBlcy4NCisNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAtbGludXguYyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC1saW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMGQzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAtbGludXguYwpAQCAtMCwwICsxLDIyMyBAQAorLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgorICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCisgKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCisgKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCisgKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCisgKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKKyAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICRJZDogYXBwLWxpbnV4LmMsdiAxLjQgMjAwNS8wMi8wOCAxODo0Mjo0OCB0b25pYyBFeHAgJAorICogJFJldmlzaW9uOiAxLjQgJAorICoKKyAqIFBhcnRzIG9mIHRoaXMgc291cmNlIGZpbGUgaXMgYmFzZWQgb24gdGVzdC9leGFtcGxlIGNvZGUgZnJvbQorICogR0xFU29uR0wgaW1wbGVtZW50YXRpb24gYnkgRGF2aWQgQmx5dGhlLiBIZXJlIGlzIGNvcHkgb2YgdGhlCisgKiBsaWNlbnNlIG5vdGljZSBmcm9tIHRoYXQgc291cmNlOgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgRGF2aWQgQmx5dGhlICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIERBVklEIEJMWVRIRSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCisjaW5jbHVkZSAiYXBwLmgiCisKKworaW50IGdBcHBBbGl2ZSA9IDE7CisKK3N0YXRpYyBjb25zdCBjaGFyIHNBcHBOYW1lW10gPQorICAgICJTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlIChMaW51eCkiOworCitzdGF0aWMgaW50IHNXaW5kb3dXaWR0aCA9IFdJTkRPV19ERUZBVUxUX1dJRFRIOworc3RhdGljIGludCBzV2luZG93SGVpZ2h0ID0gV0lORE9XX0RFRkFVTFRfSEVJR0hUOworc3RhdGljIEVHTERpc3BsYXkgc0VnbERpc3BsYXkgPSBFR0xfTk9fRElTUExBWTsKK3N0YXRpYyBFR0xDb250ZXh0IHNFZ2xDb250ZXh0ID0gRUdMX05PX0NPTlRFWFQ7CitzdGF0aWMgRUdMU3VyZmFjZSBzRWdsU3VyZmFjZSA9IEVHTF9OT19TVVJGQUNFOworCitjb25zdCBjaGFyICplZ2xfc3RyZXJyb3IodW5zaWduZWQgZXJyKQoreworICAgIHN3aXRjaChlcnIpeworICAgIGNhc2UgRUdMX1NVQ0NFU1M6IHJldHVybiAiU1VDQ0VTUyI7CisgICAgY2FzZSBFR0xfTk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gIk5PVCBJTklUSUFMSVpFRCI7CisgICAgY2FzZSBFR0xfQkFEX0FDQ0VTUzogcmV0dXJuICJCQUQgQUNDRVNTIjsKKyAgICBjYXNlIEVHTF9CQURfQUxMT0M6IHJldHVybiAiQkFEIEFMTE9DIjsKKyAgICBjYXNlIEVHTF9CQURfQVRUUklCVVRFOiByZXR1cm4gIkJBRF9BVFRSSUJVVEUiOworICAgIGNhc2UgRUdMX0JBRF9DT05GSUc6IHJldHVybiAiQkFEIENPTkZJRyI7CisgICAgY2FzZSBFR0xfQkFEX0NPTlRFWFQ6IHJldHVybiAiQkFEIENPTlRFWFQiOworICAgIGNhc2UgRUdMX0JBRF9DVVJSRU5UX1NVUkZBQ0U6IHJldHVybiAiQkFEIENVUlJFTlQgU1VSRkFDRSI7CisgICAgY2FzZSBFR0xfQkFEX0RJU1BMQVk6IHJldHVybiAiQkFEIERJU1BMQVkiOworICAgIGNhc2UgRUdMX0JBRF9NQVRDSDogcmV0dXJuICJCQUQgTUFUQ0giOworICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfUElYTUFQOiByZXR1cm4gIkJBRCBOQVRJVkUgUElYTUFQIjsKKyAgICBjYXNlIEVHTF9CQURfTkFUSVZFX1dJTkRPVzogcmV0dXJuICJCQUQgTkFUSVZFIFdJTkRPVyI7CisgICAgY2FzZSBFR0xfQkFEX1BBUkFNRVRFUjogcmV0dXJuICJCQUQgUEFSQU1FVEVSIjsKKyAgICBjYXNlIEVHTF9CQURfU1VSRkFDRTogcmV0dXJuICJCQURfU1VSRkFDRSI7CisvLyAgICBjYXNlIEVHTF9DT05URVhUX0xPU1Q6IHJldHVybiAiQ09OVEVYVCBMT1NUIjsKKyAgICBkZWZhdWx0OiByZXR1cm4gIlVOS05PV04iOworICAgIH0KK30KKwordm9pZCBlZ2xfZXJyb3IoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICB1bnNpZ25lZCBlcnIgPSBlZ2xHZXRFcnJvcigpOworICAgIGlmKGVyciAhPSBFR0xfU1VDQ0VTUykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXMoKTogZWdsIGVycm9yIDB4JXggKCVzKVxuIiwgCisgICAgICAgICAgICAgICAgbmFtZSwgZXJyLCBlZ2xfc3RyZXJyb3IoZXJyKSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjaGVja0dMRXJyb3JzKCkKK3sKKyAgICBHTGVudW0gZXJyb3IgPSBnbEdldEVycm9yKCk7CisgICAgaWYgKGVycm9yICE9IEdMX05PX0VSUk9SKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkdMIEVycm9yOiAweCUwNHhcbiIsIChpbnQpZXJyb3IpOworfQorCisKK3N0YXRpYyB2b2lkIGNoZWNrRUdMRXJyb3JzKCkKK3sKKyAgICBFR0xpbnQgZXJyb3IgPSBlZ2xHZXRFcnJvcigpOworICAgIC8vIEdMRVNvbkdMIHNlZW1zIHRvIGJlIHJldHVybmluZyAwIHdoZW4gdGhlcmUgaXMgbm8gZXJyb3JzPworICAgIGlmIChlcnJvciAmJiBlcnJvciAhPSBFR0xfU1VDQ0VTUykKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFR0wgRXJyb3I6IDB4JTA0eFxuIiwgKGludCllcnJvcik7Cit9CisKK3N0YXRpYyBpbnQgaW5pdEdyYXBoaWNzKCkKK3sKKyAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgICBFR0xfUkVEX1NJWkUsICAgICAgIDUsCisgICAgICAgICBFR0xfR1JFRU5fU0laRSwgICAgIDYsCisgICAgICAgICBFR0xfQkxVRV9TSVpFLCAgICAgIDUsCisgI2lmIDEKKyAgICAgICAgIEVHTF9ERVBUSF9TSVpFLCAgICAgMTYsCisgICAgICAgICBFR0xfU1RFTkNJTF9TSVpFLCAgIDAsCisgI2Vsc2UKKyAgICAgICAgIEVHTF9BTFBIQV9TSVpFLCAgICAgRUdMX0RPTlRfQ0FSRSwKKyAgICAgICAgIEVHTF9ERVBUSF9TSVpFLCAgICAgRUdMX0RPTlRfQ0FSRSwKKyAgICAgICAgIEVHTF9TVEVOQ0lMX1NJWkUsICAgRUdMX0RPTlRfQ0FSRSwKKyAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsICAgRUdMX0RPTlRfQ0FSRSwKKyAjZW5kaWYKKyAgICAgICAgIEVHTF9OT05FCisgICAgIH07CisgICAgIAorICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xOworICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgICBFR0xDb25maWcgY29uZmlnOworICAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKyAgICAgCisgICAgIEVHTERpc3BsYXkgZHB5OworCisgICAgIGRweSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CisgICAgIGVnbF9lcnJvcigiZWdsR2V0RGlzcGxheSIpOworICAgICBmcHJpbnRmKHN0ZGVyciwiZHB5ID0gMHglMDh4XG4iLCAodW5zaWduZWQpIGRweSk7CisgICAgIAorICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgIGVnbF9lcnJvcigiZWdsSW5pdGlhbGl6ZSIpOworCisgICAgIGVnbEdldENvbmZpZ3MoZHB5LCBOVUxMLCAwLCAmbnVtQ29uZmlncyk7CisgICAgIGVnbF9lcnJvcigiZWdsR2V0Q29uZmlncyIpOworICAgICBmcHJpbnRmKHN0ZGVyciwibnVtIGNvbmZpZ3MgJWRcbiIsIG51bUNvbmZpZ3MpOworICAgICAKKyAgICAgZWdsQ2hvb3NlQ29uZmlnKGRweSwgc19jb25maWdBdHRyaWJzLCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7CisgICAgIGVnbF9lcnJvcigiZWdsQ2hvb3NlQ29uZmlnIik7CisKKyAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsCisgICAgICAgICAgICAgYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpLCBOVUxMKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xNYXBXaW5kb3dTdXJmYWNlIik7CisKKyAgICAgZnByaW50ZihzdGRlcnIsInN1cmZhY2UgPSAlcFxuIiwgc3VyZmFjZSk7CisKKyAgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBjb25maWcsIE5VTEwsIE5VTEwpOworICAgICBlZ2xfZXJyb3IoImVnbENyZWF0ZUNvbnRleHQiKTsKKyAgICAgZnByaW50ZihzdGRlcnIsImNvbnRleHQgPSAlcFxuIiwgY29udGV4dCk7CisgICAgIAorICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOyAgIAorICAgICBlZ2xfZXJyb3IoImVnbE1ha2VDdXJyZW50Iik7CisKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmc1dpbmRvd1dpZHRoKTsKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJnNXaW5kb3dIZWlnaHQpOworCisgICAgc0VnbERpc3BsYXkgPSBkcHk7CisgICAgc0VnbFN1cmZhY2UgPSBzdXJmYWNlOworICAgIHNFZ2xDb250ZXh0ID0gY29udGV4dDsKKworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworCitzdGF0aWMgdm9pZCBkZWluaXRHcmFwaGljcygpCit7CisgICAgZWdsTWFrZUN1cnJlbnQoc0VnbERpc3BsYXksIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGVnbERlc3Ryb3lDb250ZXh0KHNFZ2xEaXNwbGF5LCBzRWdsQ29udGV4dCk7CisgICAgZWdsRGVzdHJveVN1cmZhY2Uoc0VnbERpc3BsYXksIHNFZ2xTdXJmYWNlKTsKKyAgICBlZ2xUZXJtaW5hdGUoc0VnbERpc3BsYXkpOworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgLy8gbm90IHJlZmVyZW5jZWQ6CisgICAgYXJnYyA9IGFyZ2M7CisgICAgYXJndiA9IGFyZ3Y7CisKKyAgICBpZiAoIWluaXRHcmFwaGljcygpKQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJHcmFwaGljcyBpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBhcHBJbml0KCk7CisgICAgCisgICAgd2hpbGUgKGdBcHBBbGl2ZSkKKyAgICB7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVOb3c7CisKKyAgICAgICAgaWYgKGdBcHBBbGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCZ0aW1lTm93LCBOVUxMKTsKKyAgICAgICAgICAgIGFwcFJlbmRlcih0aW1lTm93LnR2X3NlYyAqIDEwMDAgKyB0aW1lTm93LnR2X3VzZWMgLyAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgIHNXaW5kb3dXaWR0aCwgc1dpbmRvd0hlaWdodCk7CisgICAgICAgICAgICBjaGVja0dMRXJyb3JzKCk7CisgICAgICAgICAgICBlZ2xTd2FwQnVmZmVycyhzRWdsRGlzcGxheSwgc0VnbFN1cmZhY2UpOworICAgICAgICAgICAgY2hlY2tFR0xFcnJvcnMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFwcERlaW5pdCgpOworICAgIGRlaW5pdEdyYXBoaWNzKCk7CisKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGViZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLmgKQEAgLTAsMCArMSw1NiBAQAorLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgorICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCisgKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCisgKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCisgKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCisgKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKKyAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICRJZDogYXBwLmgsdiAxLjE0IDIwMDUvMDIvMDYgMjE6MTM6NTQgdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS4xNCAkCisgKi8KKworI2lmbmRlZiBBUFBfSF9JTkNMVURFRAorI2RlZmluZSBBUFBfSF9JTkNMVURFRAorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisjZGVmaW5lIFdJTkRPV19ERUZBVUxUX1dJRFRIICAgIDY0MAorI2RlZmluZSBXSU5ET1dfREVGQVVMVF9IRUlHSFQgICA0ODAKKworI2RlZmluZSBXSU5ET1dfQlBQICAgICAgICAgICAgICAxNgorCisKKy8vIFRoZSBzaW1wbGUgZnJhbWV3b3JrIGV4cGVjdHMgdGhlIGFwcGxpY2F0aW9uIGNvZGUgdG8gZGVmaW5lIHRoZXNlIGZ1bmN0aW9ucy4KK2V4dGVybiB2b2lkIGFwcEluaXQoKTsKK2V4dGVybiB2b2lkIGFwcERlaW5pdCgpOworZXh0ZXJuIHZvaWQgYXBwUmVuZGVyKGxvbmcgdGljaywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworLyogVmFsdWUgaXMgbm9uLXplcm8gd2hlbiBhcHBsaWNhdGlvbiBpcyBhbGl2ZSwgYW5kIDAgd2hlbiBpdCBpcyBjbG9zaW5nLgorICogRGVmaW5lZCBieSB0aGUgYXBwbGljYXRpb24gZnJhbWV3b3JrLgorICovCitleHRlcm4gaW50IGdBcHBBbGl2ZTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvLyAhQVBQX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2NhbXMuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2NhbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjFhY2IzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvY2Ftcy5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCisgKgorICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKKyAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgorICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQorICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgorICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgorICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgorICoKKyAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCisgKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAkSWQ6IGNhbXMuaCx2IDEuNyAyMDA1LzAxLzMxIDIyOjE1OjE1IHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNyAkCisgKi8KKworI2lmbmRlZiBDQU1TX0hfSU5DTFVERUQKKyNkZWZpbmUgQ0FNU19IX0lOQ0xVREVECisKKworLyogTGVuZ3RoIGluIG1pbGxpc2Vjb25kcyBvZiBvbmUgY2FtZXJhIHRyYWNrIGJhc2UgdW5pdC4KKyAqIFRoZSB2YWx1ZSBvcmlnaW5hdGVzIGZyb20gdGhlIG11c2ljIHN5bmNocm9uaXphdGlvbi4KKyAqLworI2RlZmluZSBDQU1UUkFDS19MRU4gICAgNTQ0MgorCisKKy8vIENhbWVyYSB0cmFjayBkZWZpbml0aW9uIGZvciBvbmUgY2FtZXJhIHRydWNraW5nIHNob3QuCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIEZpdmUgcGFyYW1ldGVycyBvZiBzcmNbNV0gYW5kIGRlc3RbNV06CisgICAgICogZXllWCwgZXllWSwgZXllWiwgdmlld0FuZ2xlLCB2aWV3SGVpZ2h0T2ZmcworICAgICAqLworICAgIHNob3J0IHNyY1s1XSwgZGVzdFs1XTsKKyAgICB1bnNpZ25lZCBjaGFyIGRpc3Q7ICAgICAvLyBpZiA+MCwgY2FtIHJvdGF0ZXMgYXJvdW5kIGV5ZSB4eSBvbiBkaXN0ICogMC4xCisgICAgdW5zaWduZWQgY2hhciBsZW47ICAgICAgLy8gbGVuZ3RoIG11bHRpcGxpZXIKK30gQ0FNVFJBQ0s7CisKK3N0YXRpYyBDQU1UUkFDSyBzQ2FtVHJhY2tzW10gPQoreworICAgIHsgeyA0NTAwLCAyNzAwLCAxMDAsIDcwLCAtMzAgfSwgeyA1MCwgNTAsIC05MCwgLTEwMCwgMCB9LCAyMCwgMSB9LAorICAgIHsgeyAtMTQ0OCwgNDI5NCwgMjUsIDM2MywgMCB9LCB7IC0xMzYsIDIwMiwgMTI1LCAtOTgsIDEwMCB9LCAwLCAxIH0sCisgICAgeyB7IDE0MzcsIDQ5MzAsIDIwMCwgLTI3NSwgLTIwIH0sIHsgMTY4NCwgMCwgMCwgOSwgMCB9LCAwLCAxIH0sCisgICAgeyB7IDE4MDAsIDM2MDksIDIwMCwgMCwgNjc1IH0sIHsgMCwgMCwgMCwgMzAwLCAwIH0sIDAsIDEgfSwKKyAgICB7IHsgOTIzLCA5OTYsIDUwLCAyMzM2LCAtODAgfSwgeyAwLCAtMjAsIC01MCwgMCwgMTcwIH0sIDAsIDEgfSwKKyAgICB7IHsgLTE2NjMsIC00MywgNjAwLCAyMTcwLCAwIH0sIHsgMjAsIDAsIC02MDAsIDAsIDEwMCB9LCAwLCAxIH0sCisgICAgeyB7IDEwNDksIC0xNDIwLCAxNzUsIDIxMTEsIC0xNyB9LCB7IDAsIDAsIDAsIC0zMzQsIDAgfSwgMCwgMiB9LAorICAgIHsgeyAwLCAwLCA1MCwgMzAwLCAyNSB9LCB7IDAsIDAsIDAsIDMwMCwgMCB9LCA3MCwgMiB9LAorICAgIHsgeyAtNDczLCAtOTUzLCAzNTAwLCAtMzUzLCAtMzUwIH0sIHsgMCwgMCwgLTI4MDAsIDAsIDAgfSwgMCwgMiB9LAorICAgIHsgeyAxOTEsIDE5MzgsIDM1LCAxMTM5LCAtMTcgfSwgeyAxMjA1LCAtMjkwOSwgMCwgMCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IC0xNDQ5LCAtMjcwMCwgMTUwLCAwLCAwIH0sIHsgMCwgMjAwMCwgMCwgMCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IDUyNzMsIDQ5OTIsIDY1MCwgMzczLCAtNTAgfSwgeyAtNDU5OCwgLTMwNzIsIDAsIDAsIDAgfSwgMCwgMiB9LAorICAgIHsgeyAzMjIzLCAtMzI4MiwgMTA3NSwgLTM5MywgLTI1IH0sIHsgMTY0OSwgLTE2NDksIDAsIDAsIDAgfSwgMCwgMiB9Cit9OworI2RlZmluZSBDQU1UUkFDS19DT1VOVCAoc2l6ZW9mKGNhbVRyYWNrcykgLyBzaXplb2YoY2FtVHJhY2tzWzBdKSkKKworCisjZW5kaWYgLy8gIUNBTVNfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvZGVtby5jIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvZGVtby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMmYzOTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9kZW1vLmMKQEAgLTAsMCArMSw3OTIgQEAKKy8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCisgKgorICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKKyAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgorICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQorICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgorICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgorICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgorICoKKyAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCisgKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAkSWQ6IGRlbW8uYyx2IDEuMTAgMjAwNS8wMi8wOCAyMDo1NDozOSB0b25pYyBFeHAgJAorICogJFJldmlzaW9uOiAxLjEwICQKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKyNpbmNsdWRlICJhcHAuaCIKKyNpbmNsdWRlICJzaGFwZXMuaCIKKyNpbmNsdWRlICJjYW1zLmgiCisKKworLy8gVG90YWwgcnVuIGxlbmd0aCBpcyAyMCAqIGNhbWVyYSB0cmFjayBiYXNlIHVuaXQgbGVuZ3RoIChzZWUgY2Ftcy5oKS4KKyNkZWZpbmUgUlVOX0xFTkdUSCAgKDIwICogQ0FNVFJBQ0tfTEVOKQorI3VuZGVmIFBJCisjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzMmYKKyNkZWZpbmUgUkFORE9NX1VJTlRfTUFYIDY1NTM1CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc1JhbmRvbVNlZWQgPSAwOworCitzdGF0aWMgdm9pZCBzZWVkUmFuZG9tKHVuc2lnbmVkIGxvbmcgc2VlZCkKK3sKKyAgICBzUmFuZG9tU2VlZCA9IHNlZWQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJhbmRvbVVJbnQoKQoreworICAgIHNSYW5kb21TZWVkID0gc1JhbmRvbVNlZWQgKiAweDM0M2ZkICsgMHgyNjllYzM7CisgICAgcmV0dXJuIHNSYW5kb21TZWVkID4+IDE2OworfQorCisKKy8vIENhcHBlZCBjb252ZXJzaW9uIGZyb20gZmxvYXQgdG8gZml4ZWQuCitzdGF0aWMgbG9uZyBmbG9hdFRvRml4ZWQoZmxvYXQgdmFsdWUpCit7CisgICAgaWYgKHZhbHVlIDwgLTMyNzY4KSB2YWx1ZSA9IC0zMjc2ODsKKyAgICBpZiAodmFsdWUgPiAzMjc2NykgdmFsdWUgPSAzMjc2NzsKKyAgICByZXR1cm4gKGxvbmcpKHZhbHVlICogNjU1MzYpOworfQorCisjZGVmaW5lIEZJWEVEKHZhbHVlKSBmbG9hdFRvRml4ZWQodmFsdWUpCisKKworLy8gRGVmaW5pdGlvbiBvZiBvbmUgR0wgb2JqZWN0IGluIHRoaXMgZGVtby4KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBWZXJ0ZXggYXJyYXkgYW5kIGNvbG9yIGFycmF5IGFyZSBlbmFibGVkIGZvciBhbGwgb2JqZWN0cywgc28gdGhlaXIKKyAgICAgKiBwb2ludGVycyBtdXN0IGFsd2F5cyBiZSB2YWxpZCBhbmQgbm9uLU5VTEwuIE5vcm1hbCBhcnJheSBpcyBub3QKKyAgICAgKiB1c2VkIGJ5IHRoZSBncm91bmQgcGxhbmUsIHNvIHdoZW4gaXRzIHBvaW50ZXIgaXMgTlVMTCB0aGVuIG5vcm1hbAorICAgICAqIGFycmF5IHVzYWdlIGlzIGRpc2FibGVkLgorICAgICAqCisgICAgICogVmVydGV4IGFycmF5IGlzIHN1cHBvc2VkIHRvIHVzZSBHTF9GSVhFRCBkYXRhdHlwZSBhbmQgc3RyaWRlIDAKKyAgICAgKiAoaS5lLiB0aWdodGx5IHBhY2tlZCBhcnJheSkuIENvbG9yIGFycmF5IGlzIHN1cHBvc2VkIHRvIGhhdmUgNAorICAgICAqIGNvbXBvbmVudHMgcGVyIGNvbG9yIHdpdGggR0xfVU5TSUdORURfQllURSBkYXRhdHlwZSBhbmQgc3RyaWRlIDAuCisgICAgICogTm9ybWFsIGFycmF5IGlzIHN1cHBvc2VkIHRvIHVzZSBHTF9GSVhFRCBkYXRhdHlwZSBhbmQgc3RyaWRlIDAuCisgICAgICovCisgICAgR0xmaXhlZCAqdmVydGV4QXJyYXk7CisgICAgR0x1Ynl0ZSAqY29sb3JBcnJheTsKKyAgICBHTGZpeGVkICpub3JtYWxBcnJheTsKKyAgICBHTGludCB2ZXJ0ZXhDb21wb25lbnRzOworICAgIEdMc2l6ZWkgY291bnQ7Cit9IEdMT0JKRUNUOworCisKK3N0YXRpYyBsb25nIHNTdGFydFRpY2sgPSAwOworc3RhdGljIGxvbmcgc1RpY2sgPSAwOworCitzdGF0aWMgaW50IHNDdXJyZW50Q2FtVHJhY2sgPSAwOworc3RhdGljIGxvbmcgc0N1cnJlbnRDYW1UcmFja1N0YXJ0VGljayA9IDA7CitzdGF0aWMgbG9uZyBzTmV4dENhbVRyYWNrU3RhcnRUaWNrID0gMHg3ZmZmZmZmZjsKKworc3RhdGljIEdMT0JKRUNUICpzU3VwZXJTaGFwZU9iamVjdHNbU1VQRVJTSEFQRV9DT1VOVF0gPSB7IE5VTEwgfTsKK3N0YXRpYyBHTE9CSkVDVCAqc0dyb3VuZFBsYW5lID0gTlVMTDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgeCwgeSwgejsKK30gVkVDVE9SMzsKKworCitzdGF0aWMgdm9pZCBmcmVlR0xPYmplY3QoR0xPQkpFQ1QgKm9iamVjdCkKK3sKKyAgICBpZiAob2JqZWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBmcmVlKG9iamVjdC0+bm9ybWFsQXJyYXkpOworICAgIGZyZWUob2JqZWN0LT5jb2xvckFycmF5KTsKKyAgICBmcmVlKG9iamVjdC0+dmVydGV4QXJyYXkpOworICAgIGZyZWUob2JqZWN0KTsKK30KKworCitzdGF0aWMgR0xPQkpFQ1QgKiBuZXdHTE9iamVjdChsb25nIHZlcnRpY2VzLCBpbnQgdmVydGV4Q29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VOb3JtYWxBcnJheSkKK3sKKyAgICBHTE9CSkVDVCAqcmVzdWx0OworICAgIHJlc3VsdCA9IChHTE9CSkVDVCAqKW1hbGxvYyhzaXplb2YoR0xPQkpFQ1QpKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdC0+Y291bnQgPSB2ZXJ0aWNlczsKKyAgICByZXN1bHQtPnZlcnRleENvbXBvbmVudHMgPSB2ZXJ0ZXhDb21wb25lbnRzOworICAgIHJlc3VsdC0+dmVydGV4QXJyYXkgPSAoR0xmaXhlZCAqKW1hbGxvYyh2ZXJ0aWNlcyAqIHZlcnRleENvbXBvbmVudHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoR0xmaXhlZCkpOworICAgIHJlc3VsdC0+Y29sb3JBcnJheSA9IChHTHVieXRlICopbWFsbG9jKHZlcnRpY2VzICogNCAqIHNpemVvZihHTHVieXRlKSk7CisgICAgaWYgKHVzZU5vcm1hbEFycmF5KQorICAgIHsKKyAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheSA9IChHTGZpeGVkICopbWFsbG9jKHZlcnRpY2VzICogMyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoR0xmaXhlZCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXkgPSBOVUxMOworICAgIGlmIChyZXN1bHQtPnZlcnRleEFycmF5ID09IE5VTEwgfHwKKyAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5ID09IE5VTEwgfHwKKyAgICAgICAgKHVzZU5vcm1hbEFycmF5ICYmIHJlc3VsdC0+bm9ybWFsQXJyYXkgPT0gTlVMTCkpCisgICAgeworICAgICAgICBmcmVlR0xPYmplY3QocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHZvaWQgZHJhd0dMT2JqZWN0KEdMT0JKRUNUICpvYmplY3QpCit7CisgICAgYXNzZXJ0KG9iamVjdCAhPSBOVUxMKTsKKworICAgIGdsVmVydGV4UG9pbnRlcihvYmplY3QtPnZlcnRleENvbXBvbmVudHMsIEdMX0ZJWEVELAorICAgICAgICAgICAgICAgICAgICAwLCBvYmplY3QtPnZlcnRleEFycmF5KTsKKyAgICBnbENvbG9yUG9pbnRlcig0LCBHTF9VTlNJR05FRF9CWVRFLCAwLCBvYmplY3QtPmNvbG9yQXJyYXkpOworCisgICAgLy8gQWxyZWFkeSBkb25lIGluIGluaXRpYWxpemF0aW9uOgorICAgIC8vZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOworICAgIC8vZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CisKKyAgICBpZiAob2JqZWN0LT5ub3JtYWxBcnJheSkKKyAgICB7CisgICAgICAgIGdsTm9ybWFsUG9pbnRlcihHTF9GSVhFRCwgMCwgb2JqZWN0LT5ub3JtYWxBcnJheSk7CisgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOworICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIG9iamVjdC0+Y291bnQpOworfQorCisKK3N0YXRpYyB2b2lkIHZlY3RvcjNTdWIoVkVDVE9SMyAqZGVzdCwgVkVDVE9SMyAqdjEsIFZFQ1RPUjMgKnYyKQoreworICAgIGRlc3QtPnggPSB2MS0+eCAtIHYyLT54OworICAgIGRlc3QtPnkgPSB2MS0+eSAtIHYyLT55OworICAgIGRlc3QtPnogPSB2MS0+eiAtIHYyLT56OworfQorCisKK3N0YXRpYyB2b2lkIHN1cGVyU2hhcGVNYXAoVkVDVE9SMyAqcG9pbnQsIGZsb2F0IHIxLCBmbG9hdCByMiwgZmxvYXQgdCwgZmxvYXQgcCkKK3sKKyAgICAvLyBzcGhlcmUtbWFwcGluZyBvZiBzdXBlcnNoYXBlIHBhcmFtZXRlcnMKKyAgICBwb2ludC0+eCA9IChmbG9hdCkoY29zKHQpICogY29zKHApIC8gcjEgLyByMik7CisgICAgcG9pbnQtPnkgPSAoZmxvYXQpKHNpbih0KSAqIGNvcyhwKSAvIHIxIC8gcjIpOworICAgIHBvaW50LT56ID0gKGZsb2F0KShzaW4ocCkgLyByMik7Cit9CisKKworc3RhdGljIGZsb2F0IHNzRnVuYyhjb25zdCBmbG9hdCB0LCBjb25zdCBmbG9hdCAqcCkKK3sKKyAgICByZXR1cm4gKGZsb2F0KShwb3cocG93KGZhYnMoY29zKHBbMF0gKiB0IC8gNCkpIC8gcFsxXSwgcFs0XSkgKworICAgICAgICAgICAgICAgICAgICAgICBwb3coZmFicyhzaW4ocFswXSAqIHQgLyA0KSkgLyBwWzJdLCBwWzVdKSwgMSAvIHBbM10pKTsKK30KKworCisvLyBDcmVhdGVzIGFuZCByZXR1cm5zIGEgc3VwZXJzaGFwZSBvYmplY3QuCisvLyBCYXNlZCBvbiBQYXVsIEJvdXJrZSdzIFBPVi1SYXkgaW1wbGVtZW50YXRpb24uCisvLyBodHRwOi8vYXN0cm9ub215LnN3aW4uZWR1LmF1L35wYm91cmtlL3BvdnJheS9zdXBlcnNoYXBlLworc3RhdGljIEdMT0JKRUNUICogY3JlYXRlU3VwZXJTaGFwZShjb25zdCBmbG9hdCAqcGFyYW1zKQoreworICAgIGNvbnN0IGludCByZXNvbDEgPSAoaW50KXBhcmFtc1tTVVBFUlNIQVBFX1BBUkFNUyAtIDNdOworICAgIGNvbnN0IGludCByZXNvbDIgPSAoaW50KXBhcmFtc1tTVVBFUlNIQVBFX1BBUkFNUyAtIDJdOworICAgIC8vIGxhdGl0dWRlIDAgdG8gcGkvMiBmb3Igbm8gbWlycm9yZWQgYm90dG9tCisgICAgLy8gKGxhdGl0dWRlQmVnaW49PTAgZm9yIC1waS8yIHRvIHBpLzIgb3JpZ2luYWxseSkKKyAgICBjb25zdCBpbnQgbGF0aXR1ZGVCZWdpbiA9IHJlc29sMiAvIDQ7CisgICAgY29uc3QgaW50IGxhdGl0dWRlRW5kID0gcmVzb2wyIC8gMjsgICAgLy8gbm9uLWluY2x1c2l2ZQorICAgIGNvbnN0IGludCBsb25naXR1ZGVDb3VudCA9IHJlc29sMTsKKyAgICBjb25zdCBpbnQgbGF0aXR1ZGVDb3VudCA9IGxhdGl0dWRlRW5kIC0gbGF0aXR1ZGVCZWdpbjsKKyAgICBjb25zdCBsb25nIHRyaWFuZ2xlQ291bnQgPSBsb25naXR1ZGVDb3VudCAqIGxhdGl0dWRlQ291bnQgKiAyOworICAgIGNvbnN0IGxvbmcgdmVydGljZXMgPSB0cmlhbmdsZUNvdW50ICogMzsKKyAgICBHTE9CSkVDVCAqcmVzdWx0OworICAgIGZsb2F0IGJhc2VDb2xvclszXTsKKyAgICBpbnQgYSwgbG9uZ2l0dWRlLCBsYXRpdHVkZTsKKyAgICBsb25nIGN1cnJlbnRWZXJ0ZXgsIGN1cnJlbnRRdWFkOworCisgICAgcmVzdWx0ID0gbmV3R0xPYmplY3QodmVydGljZXMsIDMsIDEpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGEgPSAwOyBhIDwgMzsgKythKQorICAgICAgICBiYXNlQ29sb3JbYV0gPSAoKHJhbmRvbVVJbnQoKSAlIDE1NSkgKyAxMDApIC8gMjU1LmY7CisKKyAgICBjdXJyZW50UXVhZCA9IDA7CisgICAgY3VycmVudFZlcnRleCA9IDA7CisKKyAgICAvLyBsb25naXR1ZGUgLXBpIHRvIHBpCisgICAgZm9yIChsb25naXR1ZGUgPSAwOyBsb25naXR1ZGUgPCBsb25naXR1ZGVDb3VudDsgKytsb25naXR1ZGUpCisgICAgeworCisgICAgICAgIC8vIGxhdGl0dWRlIDAgdG8gcGkvMgorICAgICAgICBmb3IgKGxhdGl0dWRlID0gbGF0aXR1ZGVCZWdpbjsgbGF0aXR1ZGUgPCBsYXRpdHVkZUVuZDsgKytsYXRpdHVkZSkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgdDEgPSAtUEkgKyBsb25naXR1ZGUgKiAyICogUEkgLyByZXNvbDE7CisgICAgICAgICAgICBmbG9hdCB0MiA9IC1QSSArIChsb25naXR1ZGUgKyAxKSAqIDIgKiBQSSAvIHJlc29sMTsKKyAgICAgICAgICAgIGZsb2F0IHAxID0gLVBJIC8gMiArIGxhdGl0dWRlICogMiAqIFBJIC8gcmVzb2wyOworICAgICAgICAgICAgZmxvYXQgcDIgPSAtUEkgLyAyICsgKGxhdGl0dWRlICsgMSkgKiAyICogUEkgLyByZXNvbDI7CisgICAgICAgICAgICBmbG9hdCByMCwgcjEsIHIyLCByMzsKKworICAgICAgICAgICAgcjAgPSBzc0Z1bmModDEsIHBhcmFtcyk7CisgICAgICAgICAgICByMSA9IHNzRnVuYyhwMSwgJnBhcmFtc1s2XSk7CisgICAgICAgICAgICByMiA9IHNzRnVuYyh0MiwgcGFyYW1zKTsKKyAgICAgICAgICAgIHIzID0gc3NGdW5jKHAyLCAmcGFyYW1zWzZdKTsKKworICAgICAgICAgICAgaWYgKHIwICE9IDAgJiYgcjEgIT0gMCAmJiByMiAhPSAwICYmIHIzICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVkVDVE9SMyBwYSwgcGIsIHBjLCBwZDsKKyAgICAgICAgICAgICAgICBWRUNUT1IzIHYxLCB2MiwgbjsKKyAgICAgICAgICAgICAgICBmbG9hdCBjYTsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAvL2Zsb2F0IGxlblNxLCBpbnZMZW5TcTsKKworICAgICAgICAgICAgICAgIHN1cGVyU2hhcGVNYXAoJnBhLCByMCwgcjEsIHQxLCBwMSk7CisgICAgICAgICAgICAgICAgc3VwZXJTaGFwZU1hcCgmcGIsIHIyLCByMSwgdDIsIHAxKTsKKyAgICAgICAgICAgICAgICBzdXBlclNoYXBlTWFwKCZwYywgcjIsIHIzLCB0MiwgcDIpOworICAgICAgICAgICAgICAgIHN1cGVyU2hhcGVNYXAoJnBkLCByMCwgcjMsIHQxLCBwMik7CisKKyAgICAgICAgICAgICAgICAvLyBrbHVkZ2UgdG8gc2V0IGxvd2VyIGVkZ2Ugb2YgdGhlIG9iamVjdCB0byBmaXhlZCBsZXZlbAorICAgICAgICAgICAgICAgIGlmIChsYXRpdHVkZSA9PSBsYXRpdHVkZUJlZ2luICsgMSkKKyAgICAgICAgICAgICAgICAgICAgcGEueiA9IHBiLnogPSAwOworCisgICAgICAgICAgICAgICAgdmVjdG9yM1N1YigmdjEsICZwYiwgJnBhKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IzU3ViKCZ2MiwgJnBkLCAmcGEpOworCisgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG5vcm1hbCB3aXRoIGNyb3NzIHByb2R1Y3QuCisgICAgICAgICAgICAgICAgLyogICBpICAgIGogICAgayAgICAgIGkgICAgagorICAgICAgICAgICAgICAgICAqIHYxLnggdjEueSB2MS56IHwgdjEueCB2MS55CisgICAgICAgICAgICAgICAgICogdjIueCB2Mi55IHYyLnogfCB2Mi54IHYyLnkKKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIG4ueCA9IHYxLnkgKiB2Mi56IC0gdjEueiAqIHYyLnk7CisgICAgICAgICAgICAgICAgbi55ID0gdjEueiAqIHYyLnggLSB2MS54ICogdjIuejsKKyAgICAgICAgICAgICAgICBuLnogPSB2MS54ICogdjIueSAtIHYxLnkgKiB2Mi54OworCisgICAgICAgICAgICAgICAgLyogUHJlLW5vcm1hbGl6YXRpb24gb2YgdGhlIG5vcm1hbHMgaXMgZGlzYWJsZWQgaGVyZSBiZWNhdXNlCisgICAgICAgICAgICAgICAgICogdGhleSB3aWxsIGJlIG5vcm1hbGl6ZWQgYW55d2F5IGxhdGVyIGR1ZSB0byBhdXRvbWF0aWMKKyAgICAgICAgICAgICAgICAgKiBub3JtYWxpemF0aW9uIChHTF9OT1JNQUxJWkUpLiBJdCBpcyBlbmFibGVkIGJlY2F1c2UgdGhlCisgICAgICAgICAgICAgICAgICogb2JqZWN0cyBhcmUgc2NhbGVkIHdpdGggZ2xTY2FsZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIGxlblNxID0gbi54ICogbi54ICsgbi55ICogbi55ICsgbi56ICogbi56OworICAgICAgICAgICAgICAgIGludkxlblNxID0gKGZsb2F0KSgxIC8gc3FydChsZW5TcSkpOworICAgICAgICAgICAgICAgIG4ueCAqPSBpbnZMZW5TcTsKKyAgICAgICAgICAgICAgICBuLnkgKj0gaW52TGVuU3E7CisgICAgICAgICAgICAgICAgbi56ICo9IGludkxlblNxOworICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICBjYSA9IHBhLnogKyAwLjVmOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gY3VycmVudFZlcnRleCAqIDM7CisgICAgICAgICAgICAgICAgICAgICBpIDwgKGN1cnJlbnRWZXJ0ZXggKyA2KSAqIDM7CisgICAgICAgICAgICAgICAgICAgICBpICs9IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5W2ldID0gRklYRUQobi54KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheVtpICsgMV0gPSBGSVhFRChuLnkpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5W2kgKyAyXSA9IEZJWEVEKG4ueik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IGN1cnJlbnRWZXJ0ZXggKiA0OworICAgICAgICAgICAgICAgICAgICAgaSA8IChjdXJyZW50VmVydGV4ICsgNikgKiA0OworICAgICAgICAgICAgICAgICAgICAgaSArPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGEsIGNvbG9yWzNdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGEgPSAwOyBhIDwgMzsgKythKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclthXSA9IChpbnQpKGNhICogYmFzZUNvbG9yW2FdICogMjU1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvclthXSA+IDI1NSkgY29sb3JbYV0gPSAyNTU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2ldID0gKEdMdWJ5dGUpY29sb3JbMF07CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgMV0gPSAoR0x1Ynl0ZSljb2xvclsxXTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAyXSA9IChHTHVieXRlKWNvbG9yWzJdOworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDNdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYS54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYS55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYS56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYi54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYi55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYi56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwZC54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwZC55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwZC56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYi54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYi55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYi56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYy54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYy55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYy56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwZC54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwZC55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwZC56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICB9IC8vIHIwICYmIHIxICYmIHIyICYmIHIzCisgICAgICAgICAgICArK2N1cnJlbnRRdWFkOworICAgICAgICB9IC8vIGxhdGl0dWRlCisgICAgfSAvLyBsb25naXR1ZGUKKworICAgIC8vIFNldCBudW1iZXIgb2YgdmVydGljZXMgaW4gb2JqZWN0IHRvIHRoZSBhY3R1YWwgYW1vdW50IGNyZWF0ZWQuCisgICAgcmVzdWx0LT5jb3VudCA9IGN1cnJlbnRWZXJ0ZXg7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBHTE9CSkVDVCAqIGNyZWF0ZUdyb3VuZFBsYW5lKCkKK3sKKyAgICBjb25zdCBpbnQgc2NhbGUgPSA0OworICAgIGNvbnN0IGludCB5QmVnaW4gPSAtMTUsIHlFbmQgPSAxNTsgICAgLy8gZW5kcyBhcmUgbm9uLWluY2x1c2l2ZQorICAgIGNvbnN0IGludCB4QmVnaW4gPSAtMTUsIHhFbmQgPSAxNTsKKyAgICBjb25zdCBsb25nIHRyaWFuZ2xlQ291bnQgPSAoeUVuZCAtIHlCZWdpbikgKiAoeEVuZCAtIHhCZWdpbikgKiAyOworICAgIGNvbnN0IGxvbmcgdmVydGljZXMgPSB0cmlhbmdsZUNvdW50ICogMzsKKyAgICBHTE9CSkVDVCAqcmVzdWx0OworICAgIGludCB4LCB5OworICAgIGxvbmcgY3VycmVudFZlcnRleCwgY3VycmVudFF1YWQ7CisKKyAgICByZXN1bHQgPSBuZXdHTE9iamVjdCh2ZXJ0aWNlcywgMiwgMCk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGN1cnJlbnRRdWFkID0gMDsKKyAgICBjdXJyZW50VmVydGV4ID0gMDsKKworICAgIGZvciAoeSA9IHlCZWdpbjsgeSA8IHlFbmQ7ICsreSkKKyAgICB7CisgICAgICAgIGZvciAoeCA9IHhCZWdpbjsgeCA8IHhFbmQ7ICsreCkKKyAgICAgICAgeworICAgICAgICAgICAgR0x1Ynl0ZSBjb2xvcjsKKyAgICAgICAgICAgIGludCBpLCBhOworICAgICAgICAgICAgY29sb3IgPSAoR0x1Ynl0ZSkoKHJhbmRvbVVJbnQoKSAmIDB4NWYpICsgODEpOyAgLy8gMTAxIDExMTEKKyAgICAgICAgICAgIGZvciAoaSA9IGN1cnJlbnRWZXJ0ZXggKiA0OyBpIDwgKGN1cnJlbnRWZXJ0ZXggKyA2KSAqIDQ7IGkgKz0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaV0gPSBjb2xvcjsKKyAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDFdID0gY29sb3I7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAyXSA9IGNvbG9yOworICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgM10gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBeGlzIGJpdHMgZm9yIHF1YWQgdHJpYW5nbGVzOgorICAgICAgICAgICAgLy8geDogMDExMTAwICgweDFjKSwgeTogMTEwMDAxICgweDMxKSAgKGNsb2Nrd2lzZSkKKyAgICAgICAgICAgIC8vIHg6IDAwMTExMCAoMHgwZSksIHk6IDEwMDAxMSAoMHgyMykgIChjb3VudGVyLWNsb2Nrd2lzZSkKKyAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCA2OyArK2EpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHhtID0geCArICgoMHgxYyA+PiBhKSAmIDEpOworICAgICAgICAgICAgICAgIGNvbnN0IGludCB5bSA9IHkgKyAoKDB4MzEgPj4gYSkgJiAxKTsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBtID0gKGZsb2F0KShjb3MoeG0gKiAyKSAqIHNpbih5bSAqIDQpICogMC43NWYpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDJdID0KKyAgICAgICAgICAgICAgICAgICAgRklYRUQoeG0gKiBzY2FsZSArIG0pOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDIgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIEZJWEVEKHltICogc2NhbGUgKyBtKTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2N1cnJlbnRRdWFkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHZvaWQgZHJhd0dyb3VuZFBsYW5lKCkKK3sKKyAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgIGdsQmxlbmRGdW5jKEdMX1pFUk8sIEdMX1NSQ19DT0xPUik7CisgICAgZ2xEaXNhYmxlKEdMX0xJR0hUSU5HKTsKKworICAgIGRyYXdHTE9iamVjdChzR3JvdW5kUGxhbmUpOworCisgICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOworICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7Cit9CisKKworc3RhdGljIHZvaWQgZHJhd0ZhZGVRdWFkKCkKK3sKKyAgICBzdGF0aWMgY29uc3QgR0xmaXhlZCBxdWFkVmVydGljZXNbXSA9IHsKKyAgICAgICAgLTB4MTAwMDAsIC0weDEwMDAwLAorICAgICAgICAgMHgxMDAwMCwgLTB4MTAwMDAsCisgICAgICAgIC0weDEwMDAwLCAgMHgxMDAwMCwKKyAgICAgICAgIDB4MTAwMDAsIC0weDEwMDAwLAorICAgICAgICAgMHgxMDAwMCwgIDB4MTAwMDAsCisgICAgICAgIC0weDEwMDAwLCAgMHgxMDAwMAorICAgIH07CisKKyAgICBjb25zdCBpbnQgYmVnaW5GYWRlID0gc1RpY2sgLSBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrOworICAgIGNvbnN0IGludCBlbmRGYWRlID0gc05leHRDYW1UcmFja1N0YXJ0VGljayAtIHNUaWNrOworICAgIGNvbnN0IGludCBtaW5GYWRlID0gYmVnaW5GYWRlIDwgZW5kRmFkZSA/IGJlZ2luRmFkZSA6IGVuZEZhZGU7CisKKyAgICBpZiAobWluRmFkZSA8IDEwMjQpCisgICAgeworICAgICAgICBjb25zdCBHTGZpeGVkIGZhZGVDb2xvciA9IG1pbkZhZGUgPDwgNjsKKyAgICAgICAgZ2xDb2xvcjR4KGZhZGVDb2xvciwgZmFkZUNvbG9yLCBmYWRlQ29sb3IsIDApOworCisgICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgICAgICBnbEJsZW5kRnVuYyhHTF9aRVJPLCBHTF9TUkNfQ09MT1IpOworICAgICAgICBnbERpc2FibGUoR0xfTElHSFRJTkcpOworCisgICAgICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworICAgICAgICBnbExvYWRJZGVudGl0eSgpOworCisgICAgICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgICAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKKworICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CisgICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7CisgICAgICAgIGdsVmVydGV4UG9pbnRlcigyLCBHTF9GSVhFRCwgMCwgcXVhZFZlcnRpY2VzKTsKKyAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFUywgMCwgNik7CisKKyAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CisKKyAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisKKyAgICAgICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOworICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICB9Cit9CisKKworLy8gQ2FsbGVkIGZyb20gdGhlIGFwcCBmcmFtZXdvcmsuCit2b2lkIGFwcEluaXQoKQoreworICAgIGludCBhOworCisgICAgZ2xFbmFibGUoR0xfTk9STUFMSVpFKTsKKyAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICBnbFNoYWRlTW9kZWwoR0xfRkxBVCk7CisKKyAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CisgICAgZ2xFbmFibGUoR0xfTElHSFQwKTsKKyAgICBnbEVuYWJsZShHTF9MSUdIVDEpOworICAgIGdsRW5hYmxlKEdMX0xJR0hUMik7CisKKyAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7CisgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CisKKyAgICBzZWVkUmFuZG9tKDE1KTsKKworICAgIGZvciAoYSA9IDA7IGEgPCBTVVBFUlNIQVBFX0NPVU5UOyArK2EpCisgICAgeworICAgICAgICBzU3VwZXJTaGFwZU9iamVjdHNbYV0gPSBjcmVhdGVTdXBlclNoYXBlKHNTdXBlclNoYXBlUGFyYW1zW2FdKTsKKyAgICAgICAgYXNzZXJ0KHNTdXBlclNoYXBlT2JqZWN0c1thXSAhPSBOVUxMKTsKKyAgICB9CisgICAgc0dyb3VuZFBsYW5lID0gY3JlYXRlR3JvdW5kUGxhbmUoKTsKKyAgICBhc3NlcnQoc0dyb3VuZFBsYW5lICE9IE5VTEwpOworfQorCisKKy8vIENhbGxlZCBmcm9tIHRoZSBhcHAgZnJhbWV3b3JrLgordm9pZCBhcHBEZWluaXQoKQoreworICAgIGludCBhOworICAgIGZvciAoYSA9IDA7IGEgPCBTVVBFUlNIQVBFX0NPVU5UOyArK2EpCisgICAgICAgIGZyZWVHTE9iamVjdChzU3VwZXJTaGFwZU9iamVjdHNbYV0pOworICAgIGZyZWVHTE9iamVjdChzR3JvdW5kUGxhbmUpOworfQorCisKK3N0YXRpYyB2b2lkIGdsdVBlcnNwZWN0aXZlKEdMZmxvYXQgZm92eSwgR0xmbG9hdCBhc3BlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpCit7CisgICAgR0xmbG9hdCB4bWluLCB4bWF4LCB5bWluLCB5bWF4OworCisgICAgeW1heCA9IHpOZWFyICogKEdMZmxvYXQpdGFuKGZvdnkgKiBQSSAvIDM2MCk7CisgICAgeW1pbiA9IC15bWF4OworICAgIHhtaW4gPSB5bWluICogYXNwZWN0OworICAgIHhtYXggPSB5bWF4ICogYXNwZWN0OworCisgICAgZ2xGcnVzdHVteCgoR0xmaXhlZCkoeG1pbiAqIDY1NTM2KSwgKEdMZml4ZWQpKHhtYXggKiA2NTUzNiksCisgICAgICAgICAgICAgICAoR0xmaXhlZCkoeW1pbiAqIDY1NTM2KSwgKEdMZml4ZWQpKHltYXggKiA2NTUzNiksCisgICAgICAgICAgICAgICAoR0xmaXhlZCkoek5lYXIgKiA2NTUzNiksIChHTGZpeGVkKSh6RmFyICogNjU1MzYpKTsKK30KKworCitzdGF0aWMgdm9pZCBwcmVwYXJlRnJhbWUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICBnbENsZWFyQ29sb3J4KChHTGZpeGVkKSgwLjFmICogNjU1MzYpLAorICAgICAgICAgICAgICAgICAgKEdMZml4ZWQpKDAuMmYgKiA2NTUzNiksCisgICAgICAgICAgICAgICAgICAoR0xmaXhlZCkoMC4zZiAqIDY1NTM2KSwgMHgxMDAwMCk7CisgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisgICAgZ2xMb2FkSWRlbnRpdHkoKTsKKyAgICBnbHVQZXJzcGVjdGl2ZSg0NSwgKGZsb2F0KXdpZHRoIC8gaGVpZ2h0LCAwLjVmLCAxNTApOworCisgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisKKyAgICBnbExvYWRJZGVudGl0eSgpOworfQorCisKK3N0YXRpYyB2b2lkIGNvbmZpZ3VyZUxpZ2h0QW5kTWF0ZXJpYWwoKQoreworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MFBvc2l0aW9uW10gPSB7IC0weDQwMDAwLCAweDEwMDAwLCAweDEwMDAwLCAwIH07CisgICAgc3RhdGljIEdMZml4ZWQgbGlnaHQwRGlmZnVzZVtdID0geyAweDEwMDAwLCAweDY2NjYsIDAsIDB4MTAwMDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDFQb3NpdGlvbltdID0geyAweDEwMDAwLCAtMHgyMDAwMCwgLTB4MTAwMDAsIDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDFEaWZmdXNlW10gPSB7IDB4MTFlYiwgMHgyM2Q3LCAweDU5OTksIDB4MTAwMDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDJQb3NpdGlvbltdID0geyAtMHgxMDAwMCwgMCwgLTB4NDAwMDAsIDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDJEaWZmdXNlW10gPSB7IDB4MTFlYiwgMHgyYjg1LCAweDIzZDcsIDB4MTAwMDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBtYXRlcmlhbFNwZWN1bGFyW10gPSB7IDB4MTAwMDAsIDB4MTAwMDAsIDB4MTAwMDAsIDB4MTAwMDAgfTsKKworICAgIGdsTGlnaHR4dihHTF9MSUdIVDAsIEdMX1BPU0lUSU9OLCBsaWdodDBQb3NpdGlvbik7CisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMCwgR0xfRElGRlVTRSwgbGlnaHQwRGlmZnVzZSk7CisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMSwgR0xfUE9TSVRJT04sIGxpZ2h0MVBvc2l0aW9uKTsKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQxLCBHTF9ESUZGVVNFLCBsaWdodDFEaWZmdXNlKTsKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQyLCBHTF9QT1NJVElPTiwgbGlnaHQyUG9zaXRpb24pOworICAgIGdsTGlnaHR4dihHTF9MSUdIVDIsIEdMX0RJRkZVU0UsIGxpZ2h0MkRpZmZ1c2UpOworICAgIGdsTWF0ZXJpYWx4dihHTF9GUk9OVF9BTkRfQkFDSywgR0xfU1BFQ1VMQVIsIG1hdGVyaWFsU3BlY3VsYXIpOworCisgICAgZ2xNYXRlcmlhbHgoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NISU5JTkVTUywgNjAgPDwgMTYpOworICAgIGdsRW5hYmxlKEdMX0NPTE9SX01BVEVSSUFMKTsKK30KKworCitzdGF0aWMgdm9pZCBkcmF3TW9kZWxzKGZsb2F0IHpTY2FsZSkKK3sKKyAgICBjb25zdCBpbnQgdHJhbnNsYXRpb25TY2FsZSA9IDk7CisgICAgaW50IHgsIHk7CisKKyAgICBzZWVkUmFuZG9tKDkpOworCisgICAgZ2xTY2FsZXgoMSA8PCAxNiwgMSA8PCAxNiwgKEdMZml4ZWQpKHpTY2FsZSAqIDY1NTM2KSk7CisKKyAgICBmb3IgKHkgPSAtNTsgeSA8PSA1OyArK3kpCisgICAgeworICAgICAgICBmb3IgKHggPSAtNTsgeCA8PSA1OyArK3gpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGJ1aWxkaW5nU2NhbGU7CisgICAgICAgICAgICBHTGZpeGVkIGZpeGVkU2NhbGU7CisKKyAgICAgICAgICAgIGludCBjdXJTaGFwZSA9IHJhbmRvbVVJbnQoKSAlIFNVUEVSU0hBUEVfQ09VTlQ7CisgICAgICAgICAgICBidWlsZGluZ1NjYWxlID0gc1N1cGVyU2hhcGVQYXJhbXNbY3VyU2hhcGVdW1NVUEVSU0hBUEVfUEFSQU1TIC0gMV07CisgICAgICAgICAgICBmaXhlZFNjYWxlID0gKEdMZml4ZWQpKGJ1aWxkaW5nU2NhbGUgKiA2NTUzNik7CisKKyAgICAgICAgICAgIGdsUHVzaE1hdHJpeCgpOworICAgICAgICAgICAgZ2xUcmFuc2xhdGV4KCh4ICogdHJhbnNsYXRpb25TY2FsZSkgKiA2NTUzNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoeSAqIHRyYW5zbGF0aW9uU2NhbGUpICogNjU1MzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBnbFJvdGF0ZXgoKEdMZml4ZWQpKChyYW5kb21VSW50KCkgJSAzNjApIDw8IDE2KSwgMCwgMCwgMSA8PCAxNik7CisgICAgICAgICAgICBnbFNjYWxleChmaXhlZFNjYWxlLCBmaXhlZFNjYWxlLCBmaXhlZFNjYWxlKTsKKworICAgICAgICAgICAgZHJhd0dMT2JqZWN0KHNTdXBlclNoYXBlT2JqZWN0c1tjdXJTaGFwZV0pOworICAgICAgICAgICAgZ2xQb3BNYXRyaXgoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoeCA9IC0yOyB4IDw9IDI7ICsreCkKKyAgICB7CisgICAgICAgIGNvbnN0IGludCBzaGlwU2NhbGUxMDAgPSB0cmFuc2xhdGlvblNjYWxlICogNTAwOworICAgICAgICBjb25zdCBpbnQgb2ZmczEwMCA9IHggKiBzaGlwU2NhbGUxMDAgKyAoc1RpY2sgJSBzaGlwU2NhbGUxMDApOworICAgICAgICBmbG9hdCBvZmZzID0gb2ZmczEwMCAqIDAuMDFmOworICAgICAgICBHTGZpeGVkIGZpeGVkT2ZmcyA9IChHTGZpeGVkKShvZmZzICogNjU1MzYpOworICAgICAgICBnbFB1c2hNYXRyaXgoKTsKKyAgICAgICAgZ2xUcmFuc2xhdGV4KGZpeGVkT2ZmcywgLTQgKiA2NTUzNiwgMiA8PCAxNik7CisgICAgICAgIGRyYXdHTE9iamVjdChzU3VwZXJTaGFwZU9iamVjdHNbU1VQRVJTSEFQRV9DT1VOVCAtIDFdKTsKKyAgICAgICAgZ2xQb3BNYXRyaXgoKTsKKyAgICAgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgICAgIGdsVHJhbnNsYXRleCgtNCAqIDY1NTM2LCBmaXhlZE9mZnMsIDQgPDwgMTYpOworICAgICAgICBnbFJvdGF0ZXgoOTAgPDwgMTYsIDAsIDAsIDEgPDwgMTYpOworICAgICAgICBkcmF3R0xPYmplY3Qoc1N1cGVyU2hhcGVPYmplY3RzW1NVUEVSU0hBUEVfQ09VTlQgLSAxXSk7CisgICAgICAgIGdsUG9wTWF0cml4KCk7CisgICAgfQorfQorCisKKy8qIEZvbGxvd2luZyBnbHVMb29rQXQgaW1wbGVtZW50YXRpb24gaXMgYWRhcHRlZCBmcm9tIHRoZQorICogTWVzYSAzRCBHcmFwaGljcyBsaWJyYXJ5LiBodHRwOi8vd3d3Lm1lc2EzZC5vcmcKKyAqLworc3RhdGljIHZvaWQgZ2x1TG9va0F0KEdMZmxvYXQgZXlleCwgR0xmbG9hdCBleWV5LCBHTGZsb2F0IGV5ZXosCisJICAgICAgICAgICAgICBHTGZsb2F0IGNlbnRlcngsIEdMZmxvYXQgY2VudGVyeSwgR0xmbG9hdCBjZW50ZXJ6LAorCSAgICAgICAgICAgICAgR0xmbG9hdCB1cHgsIEdMZmxvYXQgdXB5LCBHTGZsb2F0IHVweikKK3sKKyAgICBHTGZsb2F0IG1bMTZdOworICAgIEdMZmxvYXQgeFszXSwgeVszXSwgelszXTsKKyAgICBHTGZsb2F0IG1hZzsKKworICAgIC8qIE1ha2Ugcm90YXRpb24gbWF0cml4ICovCisKKyAgICAvKiBaIHZlY3RvciAqLworICAgIHpbMF0gPSBleWV4IC0gY2VudGVyeDsKKyAgICB6WzFdID0gZXlleSAtIGNlbnRlcnk7CisgICAgelsyXSA9IGV5ZXogLSBjZW50ZXJ6OworICAgIG1hZyA9IChmbG9hdClzcXJ0KHpbMF0gKiB6WzBdICsgelsxXSAqIHpbMV0gKyB6WzJdICogelsyXSk7CisgICAgaWYgKG1hZykgewkJCS8qIG1waWNobGVyLCAxOTk1MDUxNSAqLworICAgICAgICB6WzBdIC89IG1hZzsKKyAgICAgICAgelsxXSAvPSBtYWc7CisgICAgICAgIHpbMl0gLz0gbWFnOworICAgIH0KKworICAgIC8qIFkgdmVjdG9yICovCisgICAgeVswXSA9IHVweDsKKyAgICB5WzFdID0gdXB5OworICAgIHlbMl0gPSB1cHo7CisKKyAgICAvKiBYIHZlY3RvciA9IFkgY3Jvc3MgWiAqLworICAgIHhbMF0gPSB5WzFdICogelsyXSAtIHlbMl0gKiB6WzFdOworICAgIHhbMV0gPSAteVswXSAqIHpbMl0gKyB5WzJdICogelswXTsKKyAgICB4WzJdID0geVswXSAqIHpbMV0gLSB5WzFdICogelswXTsKKworICAgIC8qIFJlY29tcHV0ZSBZID0gWiBjcm9zcyBYICovCisgICAgeVswXSA9IHpbMV0gKiB4WzJdIC0gelsyXSAqIHhbMV07CisgICAgeVsxXSA9IC16WzBdICogeFsyXSArIHpbMl0gKiB4WzBdOworICAgIHlbMl0gPSB6WzBdICogeFsxXSAtIHpbMV0gKiB4WzBdOworCisgICAgLyogbXBpY2hsZXIsIDE5OTUwNTE1ICovCisgICAgLyogY3Jvc3MgcHJvZHVjdCBnaXZlcyBhcmVhIG9mIHBhcmFsbGVsb2dyYW0sIHdoaWNoIGlzIDwgMS4wIGZvcgorICAgICAqIG5vbi1wZXJwZW5kaWN1bGFyIHVuaXQtbGVuZ3RoIHZlY3RvcnM7IHNvIG5vcm1hbGl6ZSB4LCB5IGhlcmUKKyAgICAgKi8KKworICAgIG1hZyA9IChmbG9hdClzcXJ0KHhbMF0gKiB4WzBdICsgeFsxXSAqIHhbMV0gKyB4WzJdICogeFsyXSk7CisgICAgaWYgKG1hZykgeworICAgICAgICB4WzBdIC89IG1hZzsKKyAgICAgICAgeFsxXSAvPSBtYWc7CisgICAgICAgIHhbMl0gLz0gbWFnOworICAgIH0KKworICAgIG1hZyA9IChmbG9hdClzcXJ0KHlbMF0gKiB5WzBdICsgeVsxXSAqIHlbMV0gKyB5WzJdICogeVsyXSk7CisgICAgaWYgKG1hZykgeworICAgICAgICB5WzBdIC89IG1hZzsKKyAgICAgICAgeVsxXSAvPSBtYWc7CisgICAgICAgIHlbMl0gLz0gbWFnOworICAgIH0KKworI2RlZmluZSBNKHJvdyxjb2wpICBtW2NvbCo0K3Jvd10KKyAgICBNKDAsIDApID0geFswXTsKKyAgICBNKDAsIDEpID0geFsxXTsKKyAgICBNKDAsIDIpID0geFsyXTsKKyAgICBNKDAsIDMpID0gMC4wOworICAgIE0oMSwgMCkgPSB5WzBdOworICAgIE0oMSwgMSkgPSB5WzFdOworICAgIE0oMSwgMikgPSB5WzJdOworICAgIE0oMSwgMykgPSAwLjA7CisgICAgTSgyLCAwKSA9IHpbMF07CisgICAgTSgyLCAxKSA9IHpbMV07CisgICAgTSgyLCAyKSA9IHpbMl07CisgICAgTSgyLCAzKSA9IDAuMDsKKyAgICBNKDMsIDApID0gMC4wOworICAgIE0oMywgMSkgPSAwLjA7CisgICAgTSgzLCAyKSA9IDAuMDsKKyAgICBNKDMsIDMpID0gMS4wOworI3VuZGVmIE0KKyAgICB7CisgICAgICAgIGludCBhOworICAgICAgICBHTGZpeGVkIGZpeGVkTVsxNl07CisgICAgICAgIGZvciAoYSA9IDA7IGEgPCAxNjsgKythKQorICAgICAgICAgICAgZml4ZWRNW2FdID0gKEdMZml4ZWQpKG1bYV0gKiA2NTUzNik7CisgICAgICAgIGdsTXVsdE1hdHJpeHgoZml4ZWRNKTsKKyAgICB9CisKKyAgICAvKiBUcmFuc2xhdGUgRXllIHRvIE9yaWdpbiAqLworICAgIGdsVHJhbnNsYXRleCgoR0xmaXhlZCkoLWV5ZXggKiA2NTUzNiksCisgICAgICAgICAgICAgICAgIChHTGZpeGVkKSgtZXlleSAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgICAgKEdMZml4ZWQpKC1leWV6ICogNjU1MzYpKTsKK30KKworCitzdGF0aWMgdm9pZCBjYW1UcmFjaygpCit7CisgICAgZmxvYXQgbGVycFs1XTsKKyAgICBmbG9hdCBlWCwgZVksIGVaLCBjWCwgY1ksIGNaOworICAgIGZsb2F0IHRyYWNrUG9zOworICAgIENBTVRSQUNLICpjYW07CisgICAgbG9uZyBjdXJyZW50Q2FtVGljazsKKyAgICBpbnQgYTsKKworICAgIGlmIChzTmV4dENhbVRyYWNrU3RhcnRUaWNrIDw9IHNUaWNrKQorICAgIHsKKyAgICAgICAgKytzQ3VycmVudENhbVRyYWNrOworICAgICAgICBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrID0gc05leHRDYW1UcmFja1N0YXJ0VGljazsKKyAgICB9CisgICAgc05leHRDYW1UcmFja1N0YXJ0VGljayA9IHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2sgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2FtVHJhY2tzW3NDdXJyZW50Q2FtVHJhY2tdLmxlbiAqIENBTVRSQUNLX0xFTjsKKworICAgIGNhbSA9ICZzQ2FtVHJhY2tzW3NDdXJyZW50Q2FtVHJhY2tdOworICAgIGN1cnJlbnRDYW1UaWNrID0gc1RpY2sgLSBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrOworICAgIHRyYWNrUG9zID0gKGZsb2F0KWN1cnJlbnRDYW1UaWNrIC8gKENBTVRSQUNLX0xFTiAqIGNhbS0+bGVuKTsKKworICAgIGZvciAoYSA9IDA7IGEgPCA1OyArK2EpCisgICAgICAgIGxlcnBbYV0gPSAoY2FtLT5zcmNbYV0gKyBjYW0tPmRlc3RbYV0gKiB0cmFja1BvcykgKiAwLjAxZjsKKworICAgIGlmIChjYW0tPmRpc3QpCisgICAgeworICAgICAgICBmbG9hdCBkaXN0ID0gY2FtLT5kaXN0ICogMC4xZjsKKyAgICAgICAgY1ggPSBsZXJwWzBdOworICAgICAgICBjWSA9IGxlcnBbMV07CisgICAgICAgIGNaID0gbGVycFsyXTsKKyAgICAgICAgZVggPSBjWCAtIChmbG9hdCljb3MobGVycFszXSkgKiBkaXN0OworICAgICAgICBlWSA9IGNZIC0gKGZsb2F0KXNpbihsZXJwWzNdKSAqIGRpc3Q7CisgICAgICAgIGVaID0gY1ogLSBsZXJwWzRdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlWCA9IGxlcnBbMF07CisgICAgICAgIGVZID0gbGVycFsxXTsKKyAgICAgICAgZVogPSBsZXJwWzJdOworICAgICAgICBjWCA9IGVYICsgKGZsb2F0KWNvcyhsZXJwWzNdKTsKKyAgICAgICAgY1kgPSBlWSArIChmbG9hdClzaW4obGVycFszXSk7CisgICAgICAgIGNaID0gZVogKyBsZXJwWzRdOworICAgIH0KKyAgICBnbHVMb29rQXQoZVgsIGVZLCBlWiwgY1gsIGNZLCBjWiwgMCwgMCwgMSk7Cit9CisKKworLy8gQ2FsbGVkIGZyb20gdGhlIGFwcCBmcmFtZXdvcmsuCisvKiBUaGUgdGljayBpcyBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLCB3aWR0aCBhbmQgaGVpZ2h0CisgKiBhcmUgdGhlIGltYWdlIGRpbWVuc2lvbnMgdG8gYmUgcmVuZGVyZWQuCisgKi8KK3ZvaWQgYXBwUmVuZGVyKGxvbmcgdGljaywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGlmIChzU3RhcnRUaWNrID09IDApCisgICAgICAgIHNTdGFydFRpY2sgPSB0aWNrOworICAgIGlmICghZ0FwcEFsaXZlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBBY3R1YWwgdGljayB2YWx1ZSBpcyAiYmx1cnJlZCIgYSBsaXR0bGUgYml0LgorICAgIHNUaWNrID0gKHNUaWNrICsgdGljayAtIHNTdGFydFRpY2spID4+IDE7CisKKyAgICAvLyBUZXJtaW5hdGUgYXBwbGljYXRpb24gYWZ0ZXIgcnVubmluZyB0aHJvdWdoIHRoZSBkZW1vbnN0cmF0aW9uIG9uY2UuCisgICAgaWYgKHNUaWNrID49IFJVTl9MRU5HVEgpCisgICAgeworICAgICAgICBnQXBwQWxpdmUgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gUHJlcGFyZSBPcGVuR0wgRVMgZm9yIHJlbmRlcmluZyBvZiB0aGUgZnJhbWUuCisgICAgcHJlcGFyZUZyYW1lKHdpZHRoLCBoZWlnaHQpOworCisgICAgLy8gVXBkYXRlIHRoZSBjYW1lcmEgcG9zaXRpb24gYW5kIHNldCB0aGUgbG9va2F0LgorICAgIGNhbVRyYWNrKCk7CisKKyAgICAvLyBDb25maWd1cmUgZW52aXJvbm1lbnQuCisgICAgY29uZmlndXJlTGlnaHRBbmRNYXRlcmlhbCgpOworCisgICAgLy8gRHJhdyB0aGUgcmVmbGVjdGlvbiBieSBkcmF3aW5nIG1vZGVscyB3aXRoIG5lZ2F0ZWQgWi1heGlzLgorICAgIGdsUHVzaE1hdHJpeCgpOworICAgIGRyYXdNb2RlbHMoLTEpOworICAgIGdsUG9wTWF0cml4KCk7CisKKyAgICAvLyBCbGVuZCB0aGUgZ3JvdW5kIHBsYW5lIHRvIHRoZSB3aW5kb3cuCisgICAgZHJhd0dyb3VuZFBsYW5lKCk7CisKKyAgICAvLyBEcmF3IGFsbCB0aGUgbW9kZWxzIG5vcm1hbGx5LgorICAgIGRyYXdNb2RlbHMoMSk7CisKKyAgICAvLyBEcmF3IGZhZGUgcXVhZCBvdmVyIHdob2xlIHdpbmRvdyAod2hlbiBjaGFuZ2luZyBjYW1lcmFzKS4KKyAgICBkcmF3RmFkZVF1YWQoKTsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2dwdXN0YXRlLmMgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9ncHVzdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTQwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9ncHVzdGF0ZS5jCkBAIC0wLDAgKzEsMzkgQEAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCitzdGF0aWMgdm9pZCAqbWFwX21lbW9yeShjb25zdCBjaGFyICpmbiwgdW5zaWduZWQgYmFzZSwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICBpbnQgZmQ7CisgICAgdm9pZCAqcHRyOworICAgIAorICAgIGZkID0gb3BlbihmbiwgT19SRFdSIHwgT19TWU5DKTsKKyAgICBpZihmZCA8IDApIHsKKyAgICAgICAgcGVycm9yKCJjYW5ub3Qgb3BlbiAlcyBmb3IgbWFwcGluZyIpOworICAgICAgICByZXR1cm4gTUFQX0ZBSUxFRDsKKyAgICB9CisKKyAgICBwdHIgPSBtbWFwKDAsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBmZCwgYmFzZSk7CisgICAgY2xvc2UoZmQpOworICAgIAorICAgIGlmKHB0ciA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJjYW5ub3QgbWFwICVzIChAJTA4eCwlMDh4KVxuIiwgZm4sIGJhc2UsIHNpemUpOworICAgIH0KKyAgICByZXR1cm4gcHRyOyAgICAKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgdm9pZCAqZ3JwX3JlZ3MgPSBtYXBfbWVtb3J5KCIvZGV2L2h3M2QiLCAwLCAxMDI0ICogMTAyNCk7CisgICAgcHJpbnRmKCJHUFUgYmFzZSBtYXBwZWQgYXQgJXBcbiIsIGdycF9yZWdzKTsKKyAgICBpbnQgc3RhdGVfb2Zmc2V0ID0gMHgxMDE0MDsKKyAgICBwcmludGYoIkdQVSBzdGF0ZSA9ICUwOGx4XG4iLAorICAgICAgICAgICAgKigobG9uZyopKChjaGFyKilncnBfcmVncyArIHN0YXRlX29mZnNldCkpICApOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmODQxMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2wuaApAQCAtMCwwICsxLDIyOSBAQAorI2lmbmRlZiBfX2VnbF9oXworI2RlZmluZSBfX2VnbF9oXworCisvKgorKiogTGljZW5zZSBBcHBsaWNhYmlsaXR5LiBFeGNlcHQgdG8gdGhlIGV4dGVudCBwb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlCisqKiBtYWRlIHN1YmplY3QgdG8gYW4gYWx0ZXJuYXRpdmUgbGljZW5zZSBhcyBwZXJtaXR0ZWQgaW4gdGhlIFNHSSBGcmVlCisqKiBTb2Z0d2FyZSBMaWNlbnNlIEIsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMKKyoqIGZpbGUgYXJlIHN1YmplY3Qgb25seSB0byB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgTGljZW5zZS4gWW91IG1heSBub3QgdXNlCisqKiB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisqKiBvZiB0aGUgTGljZW5zZSBhdCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCBhdHRuOiBMZWdhbCBTZXJ2aWNlcywgMTYwMAorKiogQW1waGl0aGVhdHJlIFBhcmt3YXksIE1vdW50YWluIFZpZXcsIENBIDk0MDQzLTEzNTEsIG9yIGF0OgorKioKKyoqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQgorKioKKyoqIE5vdGUgdGhhdCwgYXMgcHJvdmlkZWQgaW4gdGhlIExpY2Vuc2UsIHRoZSBTb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiogIkFTIElTIiBiYXNpcywgd2l0aCBBTEwgRVhQUkVTUyBBTkQgSU1QTElFRCBXQVJSQU5USUVTIEFORCBDT05ESVRJT05TCisqKiBESVNDTEFJTUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIElNUExJRUQgV0FSUkFOVElFUyBBTkQKKyoqIENPTkRJVElPTlMgT0YgTUVSQ0hBTlRBQklMSVRZLCBTQVRJU0ZBQ1RPUlkgUVVBTElUWSwgRklUTkVTUyBGT1IgQQorKiogUEFSVElDVUxBUiBQVVJQT1NFLCBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyoqCisqKiBPcmlnaW5hbCBDb2RlLiBUaGUgT3JpZ2luYWwgQ29kZSBpczogT3BlbkdMIFNhbXBsZSBJbXBsZW1lbnRhdGlvbiwKKyoqIFZlcnNpb24gMS4yLjEsIHJlbGVhc2VkIEphbnVhcnkgMjYsIDIwMDAsIGRldmVsb3BlZCBieSBTaWxpY29uIEdyYXBoaWNzLAorKiogSW5jLiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKGMpIDE5OTEtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisqKiBDb3B5cmlnaHQgaW4gYW55IHBvcnRpb25zIGNyZWF0ZWQgYnkgdGhpcmQgcGFydGllcyBpcyBhcyBpbmRpY2F0ZWQKKyoqIGVsc2V3aGVyZSBoZXJlaW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqKgorKiogQWRkaXRpb25hbCBOb3RpY2UgUHJvdmlzaW9uczogVGhlIGFwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZXMKKyoqIGVzdGFibGlzaGVkIGJ5IFNHSSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBPcmlnaW5hbCBDb2RlIGFyZSBUaGUKKyoqIE9wZW5HTChSKSBHcmFwaGljcyBTeXN0ZW06IEEgU3BlY2lmaWNhdGlvbiAoVmVyc2lvbiAxLjIuMSksIHJlbGVhc2VkCisqKiBBcHJpbCAxLCAxOTk5OyBUaGUgT3BlbkdMKFIpIEdyYXBoaWNzIFN5c3RlbSBVdGlsaXR5IExpYnJhcnkgKFZlcnNpb24KKyoqIDEuMyksIHJlbGVhc2VkIE5vdmVtYmVyIDQsIDE5OTg7IGFuZCBPcGVuR0woUikgR3JhcGhpY3Mgd2l0aCB0aGUgWAorKiogV2luZG93IFN5c3RlbShSKSAoVmVyc2lvbiAxLjMpLCByZWxlYXNlZCBPY3RvYmVyIDE5LCAxOTk4LiBUaGlzIHNvZnR3YXJlCisqKiB3YXMgY3JlYXRlZCB1c2luZyB0aGUgT3BlbkdMKFIpIHZlcnNpb24gMS4yLjEgU2FtcGxlIEltcGxlbWVudGF0aW9uCisqKiBwdWJsaXNoZWQgYnkgU0dJLCBidXQgaGFzIG5vdCBiZWVuIGluZGVwZW5kZW50bHkgdmVyaWZpZWQgYXMgYmVpbmcKKyoqIGNvbXBsaWFudCB3aXRoIHRoZSBPcGVuR0woUikgdmVyc2lvbiAxLjIuMSBTcGVjaWZpY2F0aW9uLgorKi8KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2VnbHR5cGVzLmg+CisKKy8qCisqKiBlZ2x0eXBlcy5oIGlzIHBsYXRmb3JtIGRlcGVuZGVudC4gSXQgZGVmaW5lczoKKyoqCisqKiAgICAgLSBFR0wgdHlwZXMgYW5kIHJlc291cmNlcworKiogICAgIC0gTmF0aXZlIHR5cGVzCisqKiAgICAgLSBFR0wgYW5kIG5hdGl2ZSBoYW5kbGUgdmFsdWVzCisqKgorKiogRUdMIHR5cGVzIGFuZCByZXNvdXJjZXMgYXJlIHRvIGJlIHR5cGVkZWYnZWQgd2l0aCBhcHByb3ByaWF0ZSBwbGF0Zm9ybQorKiogZGVwZW5kZW50IHJlc291cmNlIGhhbmRsZSB0eXBlcy4gRUdMaW50IG11c3QgYmUgYW4gaW50ZWdlciBvZiBhdCBsZWFzdAorKiogMzItYml0LgorKioKKyoqIE5hdGl2ZURpc3BsYXlUeXBlLCBOYXRpdmVXaW5kb3dUeXBlIGFuZCBOYXRpdmVQaXhtYXBUeXBlIGFyZSB0byBiZQorKiogcmVwbGFjZWQgd2l0aCBjb3JyZXNwb25kaW5nIHR5cGVzIG9mIHRoZSBuYXRpdmUgd2luZG93IHN5c3RlbSBpbiBlZ2wuaC4KKyoqCisqKiBFR0wgYW5kIG5hdGl2ZSBoYW5kbGUgdmFsdWVzIG11c3QgbWF0Y2ggdGhlaXIgdHlwZXMuCisqKgorKiogRXhhbXBsZSBlZ2x0eXBlcy5oOgorKi8KKworI2lmIDAKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5hdGl2ZV93aW5kb3dfc3lzdGVtLmg+CisKKy8qCisqKiBUeXBlcyBhbmQgcmVzb3VyY2VzCisqLwordHlwZWRlZiBpbnQgRUdMQm9vbGVhbjsKK3R5cGVkZWYgaW50MzJfdCBFR0xpbnQ7Cit0eXBlZGVmIHZvaWQgKkVHTERpc3BsYXk7Cit0eXBlZGVmIHZvaWQgKkVHTENvbmZpZzsKK3R5cGVkZWYgdm9pZCAqRUdMU3VyZmFjZTsKK3R5cGVkZWYgdm9pZCAqRUdMQ29udGV4dDsKKworLyoKKyoqIEVHTCBhbmQgbmF0aXZlIGhhbmRsZSB2YWx1ZXMKKyovCisjZGVmaW5lIEVHTF9ERUZBVUxUX0RJU1BMQVkgKChOYXRpdmVEaXNwbGF5VHlwZSkwKQorI2RlZmluZSBFR0xfTk9fQ09OVEVYVCAoKEVHTENvbnRleHQpMCkKKyNkZWZpbmUgRUdMX05PX0RJU1BMQVkgKChFR0xEaXNwbGF5KTApCisjZGVmaW5lIEVHTF9OT19TVVJGQUNFICgoRUdMU3VyZmFjZSkwKQorCisjZW5kaWYKKworLyoKKyoqIFZlcnNpb25pbmcgYW5kIGV4dGVuc2lvbnMKKyovCisjZGVmaW5lIEVHTF9WRVJTSU9OXzFfMAkJICAgICAgIDEKKworLyoKKyoqIEJvb2xlYW4KKyovCisjZGVmaW5lIEVHTF9GQUxTRQkJICAgICAgIDAKKyNkZWZpbmUgRUdMX1RSVUUJCSAgICAgICAxCisKKy8qCisqKiBFcnJvcnMKKyovCisjZGVmaW5lIEVHTF9TVUNDRVNTCQkgICAgICAgMHgzMDAwCisjZGVmaW5lIEVHTF9OT1RfSU5JVElBTElaRUQJICAgICAgIDB4MzAwMQorI2RlZmluZSBFR0xfQkFEX0FDQ0VTUwkJICAgICAgIDB4MzAwMgorI2RlZmluZSBFR0xfQkFEX0FMTE9DCQkgICAgICAgMHgzMDAzCisjZGVmaW5lIEVHTF9CQURfQVRUUklCVVRFCSAgICAgICAweDMwMDQKKyNkZWZpbmUgRUdMX0JBRF9DT05GSUcJCSAgICAgICAweDMwMDUKKyNkZWZpbmUgRUdMX0JBRF9DT05URVhUCQkgICAgICAgMHgzMDA2CisjZGVmaW5lIEVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFICAgICAgICAweDMwMDcKKyNkZWZpbmUgRUdMX0JBRF9ESVNQTEFZCQkgICAgICAgMHgzMDA4CisjZGVmaW5lIEVHTF9CQURfTUFUQ0gJCSAgICAgICAweDMwMDkKKyNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfUElYTUFQCSAgICAgICAweDMwMEEKKyNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfV0lORE9XCSAgICAgICAweDMwMEIKKyNkZWZpbmUgRUdMX0JBRF9QQVJBTUVURVIJICAgICAgIDB4MzAwQworI2RlZmluZSBFR0xfQkFEX1NVUkZBQ0UJCSAgICAgICAweDMwMEQKKy8qIDB4MzAwRSAtIDB4MzAxRiByZXNlcnZlZCBmb3IgYWRkaXRpb25hbCBlcnJvcnMuICovCisKKy8qCisqKiBDb25maWcgYXR0cmlidXRlcworKi8KKyNkZWZpbmUgRUdMX0JVRkZFUl9TSVpFCQkgICAgICAgMHgzMDIwCisjZGVmaW5lIEVHTF9BTFBIQV9TSVpFCQkgICAgICAgMHgzMDIxCisjZGVmaW5lIEVHTF9CTFVFX1NJWkUJCSAgICAgICAweDMwMjIKKyNkZWZpbmUgRUdMX0dSRUVOX1NJWkUJCSAgICAgICAweDMwMjMKKyNkZWZpbmUgRUdMX1JFRF9TSVpFCQkgICAgICAgMHgzMDI0CisjZGVmaW5lIEVHTF9ERVBUSF9TSVpFCQkgICAgICAgMHgzMDI1CisjZGVmaW5lIEVHTF9TVEVOQ0lMX1NJWkUJICAgICAgIDB4MzAyNgorI2RlZmluZSBFR0xfQ09ORklHX0NBVkVBVAkgICAgICAgMHgzMDI3CisjZGVmaW5lIEVHTF9DT05GSUdfSUQJCSAgICAgICAweDMwMjgKKyNkZWZpbmUgRUdMX0xFVkVMCQkgICAgICAgMHgzMDI5CisjZGVmaW5lIEVHTF9NQVhfUEJVRkZFUl9IRUlHSFQJICAgICAgIDB4MzAyQQorI2RlZmluZSBFR0xfTUFYX1BCVUZGRVJfUElYRUxTCSAgICAgICAweDMwMkIKKyNkZWZpbmUgRUdMX01BWF9QQlVGRkVSX1dJRFRICSAgICAgICAweDMwMkMKKyNkZWZpbmUgRUdMX05BVElWRV9SRU5ERVJBQkxFCSAgICAgICAweDMwMkQKKyNkZWZpbmUgRUdMX05BVElWRV9WSVNVQUxfSUQJICAgICAgIDB4MzAyRQorI2RlZmluZSBFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFCSAgICAgICAweDMwMkYKKy8qI2RlZmluZSBFR0xfUFJFU0VSVkVEX1JFU09VUkNFUwkgMHgzMDMwKi8KKyNkZWZpbmUgRUdMX1NBTVBMRVMJCSAgICAgICAweDMwMzEKKyNkZWZpbmUgRUdMX1NBTVBMRV9CVUZGRVJTCSAgICAgICAweDMwMzIKKyNkZWZpbmUgRUdMX1NVUkZBQ0VfVFlQRQkgICAgICAgMHgzMDMzCisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9UWVBFCSAgICAgICAweDMwMzQKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUgICAgIDB4MzAzNQorI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUgICAgMHgzMDM2CisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUgICAgICAweDMwMzcKKworLyoKKyoqIENvbmZpZyBhdHRyaWJ1dGUgYW5kIHZhbHVlCisqLworI2RlZmluZSBFR0xfTk9ORQkJICAgICAgIDB4MzAzOAorLyogMHgzMDM5IC0gMHgzMDRGIHJlc2VydmVkIGZvciBhZGRpdGlvbmFsIGNvbmZpZyBhdHRyaWJ1dGVzLiAqLworCisvKgorKiogQ29uZmlnIHZhbHVlcworKi8KKyNkZWZpbmUgRUdMX0RPTlRfQ0FSRQkJICAgICAgICgoRUdMaW50KSAtMSkKKyNkZWZpbmUgRUdMX1BCVUZGRVJfQklUCQkgICAgICAgMHgwMQorI2RlZmluZSBFR0xfUElYTUFQX0JJVAkJICAgICAgIDB4MDIKKyNkZWZpbmUgRUdMX1dJTkRPV19CSVQJCSAgICAgICAweDA0CisjZGVmaW5lIEVHTF9TTE9XX0NPTkZJRwkJICAgICAgIDB4MzA1MAorI2RlZmluZSBFR0xfTk9OX0NPTkZPUk1BTlRfQ09ORklHICAgICAgMHgzMDUxCisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9SR0IJICAgICAgIDB4MzA1MgorCisvKgorKiogU3RyaW5nIG5hbWVzCisqLworI2RlZmluZSBFR0xfVkVORE9SCQkgICAgICAgMHgzMDUzCisjZGVmaW5lIEVHTF9WRVJTSU9OCQkgICAgICAgMHgzMDU0CisjZGVmaW5lIEVHTF9FWFRFTlNJT05TCQkgICAgICAgMHgzMDU1CisKKy8qCisqKiBTdXJmYWNlIGF0dHJpYnV0ZXMKKyovCisjZGVmaW5lIEVHTF9IRUlHSFQJCSAgICAgICAweDMwNTYKKyNkZWZpbmUgRUdMX1dJRFRICQkgICAgICAgMHgzMDU3CisjZGVmaW5lIEVHTF9MQVJHRVNUX1BCVUZGRVIJICAgICAgIDB4MzA1OAorCisvKgorKiogQ3VycmVudCBzdXJmYWNlcworKi8KKyNkZWZpbmUgRUdMX0RSQVcJCSAgICAgICAweDMwNTkKKyNkZWZpbmUgRUdMX1JFQUQJCSAgICAgICAweDMwNUEKKworLyoKKyoqIEVuZ2luZXMKKyovCisjZGVmaW5lIEVHTF9DT1JFX05BVElWRV9FTkdJTkUJICAgICAgIDB4MzA1QgorCisvKiAweDMwNUMtMHgzRkZGRiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCisvKgorKiogRnVuY3Rpb25zCisqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitHTEFQSSBFR0xpbnQgQVBJRU5UUlkgZWdsR2V0RXJyb3IgKHZvaWQpOworCitHTEFQSSBFR0xEaXNwbGF5IEFQSUVOVFJZIGVnbEdldERpc3BsYXkgKE5hdGl2ZURpc3BsYXlUeXBlIGRpc3BsYXkpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xJbml0aWFsaXplIChFR0xEaXNwbGF5IGRweSwgRUdMaW50ICptYWpvciwgRUdMaW50ICptaW5vcik7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFRlcm1pbmF0ZSAoRUdMRGlzcGxheSBkcHkpOworR0xBUEkgY29uc3QgY2hhciAqIEFQSUVOVFJZIGVnbFF1ZXJ5U3RyaW5nIChFR0xEaXNwbGF5IGRweSwgRUdMaW50IG5hbWUpOworR0xBUEkgdm9pZCAoKiBBUElFTlRSWSBlZ2xHZXRQcm9jQWRkcmVzcyAoY29uc3QgY2hhciAqcHJvY25hbWUpKSgpOworCitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbEdldENvbmZpZ3MgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgKmNvbmZpZ3MsIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50ICpudW1fY29uZmlnKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsQ2hvb3NlQ29uZmlnIChFR0xEaXNwbGF5IGRweSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCwgRUdMQ29uZmlnICpjb25maWdzLCBFR0xpbnQgY29uZmlnX3NpemUsIEVHTGludCAqbnVtX2NvbmZpZyk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbEdldENvbmZpZ0F0dHJpYiAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOworCitHTEFQSSBFR0xTdXJmYWNlIEFQSUVOVFJZIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitHTEFQSSBFR0xTdXJmYWNlIEFQSUVOVFJZIGVnbENyZWF0ZVBpeG1hcFN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBOYXRpdmVQaXhtYXBUeXBlIHBpeG1hcCwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitHTEFQSSBFR0xTdXJmYWNlIEFQSUVOVFJZIGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbERlc3Ryb3lTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsUXVlcnlTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKKworR0xBUEkgRUdMQ29udGV4dCBBUElFTlRSWSBlZ2xDcmVhdGVDb250ZXh0IChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgRUdMQ29udGV4dCBzaGFyZV9saXN0LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsRGVzdHJveUNvbnRleHQgKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbE1ha2VDdXJyZW50IChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3LCBFR0xTdXJmYWNlIHJlYWQsIEVHTENvbnRleHQgY3R4KTsKK0dMQVBJIEVHTENvbnRleHQgQVBJRU5UUlkgZWdsR2V0Q3VycmVudENvbnRleHQgKHZvaWQpOworR0xBUEkgRUdMU3VyZmFjZSBBUElFTlRSWSBlZ2xHZXRDdXJyZW50U3VyZmFjZSAoRUdMaW50IHJlYWRkcmF3KTsKK0dMQVBJIEVHTERpc3BsYXkgQVBJRU5UUlkgZWdsR2V0Q3VycmVudERpc3BsYXkgKHZvaWQpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xRdWVyeUNvbnRleHQgKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCwgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsV2FpdEdMICh2b2lkKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsV2FpdE5hdGl2ZSAoRUdMaW50IGVuZ2luZSk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFN3YXBCdWZmZXJzIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3KTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsQ29weUJ1ZmZlcnMgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIE5hdGl2ZVBpeG1hcFR5cGUgdGFyZ2V0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fX2VnbF9oXyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbHR5cGVzLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGIzNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbHR5cGVzLmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyoqIFR5cGVzIGFuZCByZXNvdXJjZXMKKyovCit0eXBlZGVmIGludCBFR0xCb29sZWFuOwordHlwZWRlZiBsb25nIEVHTGludDsKK3R5cGVkZWYgdm9pZCAqRUdMRGlzcGxheTsKK3R5cGVkZWYgdm9pZCAqRUdMQ29uZmlnOwordHlwZWRlZiB2b2lkICpFR0xTdXJmYWNlOwordHlwZWRlZiB2b2lkICpFR0xDb250ZXh0OwordHlwZWRlZiB2b2lkICpOYXRpdmVEaXNwbGF5VHlwZTsKK3R5cGVkZWYgdm9pZCAqTmF0aXZlV2luZG93VHlwZTsKK3R5cGVkZWYgdm9pZCAqTmF0aXZlUGl4bWFwVHlwZTsKKworLyoKKyoqIEVHTCBhbmQgbmF0aXZlIGhhbmRsZSB2YWx1ZXMKKyovCisjZGVmaW5lIEVHTF9ERUZBVUxUX0RJU1BMQVkgKChOYXRpdmVEaXNwbGF5VHlwZSkwKQorI2RlZmluZSBFR0xfTk9fQ09OVEVYVCAoKEVHTENvbnRleHQpMCkKKyNkZWZpbmUgRUdMX05PX0RJU1BMQVkgKChFR0xEaXNwbGF5KTApCisjZGVmaW5lIEVHTF9OT19TVVJGQUNFICgoRUdMU3VyZmFjZSkwKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2dsLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTU0ODIyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2dsLmgKQEAgLTAsMCArMSw1ODQgQEAKKyNpZm5kZWYgX19nbF9oXworI2RlZmluZSBfX2dsX2hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyoqIExpY2Vuc2UgQXBwbGljYWJpbGl0eS4gRXhjZXB0IHRvIHRoZSBleHRlbnQgcG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZQorKiogbWFkZSBzdWJqZWN0IHRvIGFuIGFsdGVybmF0aXZlIGxpY2Vuc2UgYXMgcGVybWl0dGVkIGluIHRoZSBTR0kgRnJlZQorKiogU29mdHdhcmUgTGljZW5zZSBCLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIiksIHRoZSBjb250ZW50cyBvZiB0aGlzCisqKiBmaWxlIGFyZSBzdWJqZWN0IG9ubHkgdG8gdGhlIHByb3Zpc2lvbnMgb2YgdGhlIExpY2Vuc2UuIFlvdSBtYXkgbm90IHVzZQorKiogdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorKiogb2YgdGhlIExpY2Vuc2UgYXQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgYXR0bjogTGVnYWwgU2VydmljZXMsIDE2MDAKKyoqIEFtcGhpdGhlYXRyZSBQYXJrd2F5LCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0My0xMzUxLCBvciBhdDoKKyoqIAorKiogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCCisqKiAKKyoqIE5vdGUgdGhhdCwgYXMgcHJvdmlkZWQgaW4gdGhlIExpY2Vuc2UsIHRoZSBTb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiogIkFTIElTIiBiYXNpcywgd2l0aCBBTEwgRVhQUkVTUyBBTkQgSU1QTElFRCBXQVJSQU5USUVTIEFORCBDT05ESVRJT05TCisqKiBESVNDTEFJTUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIElNUExJRUQgV0FSUkFOVElFUyBBTkQKKyoqIENPTkRJVElPTlMgT0YgTUVSQ0hBTlRBQklMSVRZLCBTQVRJU0ZBQ1RPUlkgUVVBTElUWSwgRklUTkVTUyBGT1IgQQorKiogUEFSVElDVUxBUiBQVVJQT1NFLCBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyoqIAorKiogT3JpZ2luYWwgQ29kZS4gVGhlIE9yaWdpbmFsIENvZGUgaXM6IE9wZW5HTCBTYW1wbGUgSW1wbGVtZW50YXRpb24sCisqKiBWZXJzaW9uIDEuMi4xLCByZWxlYXNlZCBKYW51YXJ5IDI2LCAyMDAwLCBkZXZlbG9wZWQgYnkgU2lsaWNvbiBHcmFwaGljcywKKyoqIEluYy4gVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChjKSAxOTkxLTIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorKiogQ29weXJpZ2h0IGluIGFueSBwb3J0aW9ucyBjcmVhdGVkIGJ5IHRoaXJkIHBhcnRpZXMgaXMgYXMgaW5kaWNhdGVkCisqKiBlbHNld2hlcmUgaGVyZWluLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorKiogCisqKiBBZGRpdGlvbmFsIE5vdGljZSBQcm92aXNpb25zOiBUaGUgYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcworKiogZXN0YWJsaXNoZWQgYnkgU0dJIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIE9yaWdpbmFsIENvZGUgYXJlIFRoZQorKiogT3BlbkdMKFIpIEdyYXBoaWNzIFN5c3RlbTogQSBTcGVjaWZpY2F0aW9uIChWZXJzaW9uIDEuMi4xKSwgcmVsZWFzZWQKKyoqIEFwcmlsIDEsIDE5OTk7IFRoZSBPcGVuR0woUikgR3JhcGhpY3MgU3lzdGVtIFV0aWxpdHkgTGlicmFyeSAoVmVyc2lvbgorKiogMS4zKSwgcmVsZWFzZWQgTm92ZW1iZXIgNCwgMTk5ODsgYW5kIE9wZW5HTChSKSBHcmFwaGljcyB3aXRoIHRoZSBYCisqKiBXaW5kb3cgU3lzdGVtKFIpIChWZXJzaW9uIDEuMyksIHJlbGVhc2VkIE9jdG9iZXIgMTksIDE5OTguIFRoaXMgc29mdHdhcmUKKyoqIHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBPcGVuR0woUikgdmVyc2lvbiAxLjIuMSBTYW1wbGUgSW1wbGVtZW50YXRpb24KKyoqIHB1Ymxpc2hlZCBieSBTR0ksIGJ1dCBoYXMgbm90IGJlZW4gaW5kZXBlbmRlbnRseSB2ZXJpZmllZCBhcyBiZWluZworKiogY29tcGxpYW50IHdpdGggdGhlIE9wZW5HTChSKSB2ZXJzaW9uIDEuMi4xIFNwZWNpZmljYXRpb24uCisqLworCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKEFQSUVOVFJZKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmbmRlZiBBUElFTlRSWQorI2RlZmluZSBBUElFTlRSWQorI2VuZGlmCisjaWZuZGVmIEdMQVBJCisjZGVmaW5lIEdMQVBJIGV4dGVybgorI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMZW51bTsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBHTGJvb2xlYW47Cit0eXBlZGVmIHVuc2lnbmVkIGludCBHTGJpdGZpZWxkOwordHlwZWRlZiBzaWduZWQgY2hhciBHTGJ5dGU7Cit0eXBlZGVmIHNob3J0IEdMc2hvcnQ7Cit0eXBlZGVmIGludCBHTGludDsKK3R5cGVkZWYgaW50IEdMc2l6ZWk7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgR0x1Ynl0ZTsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgR0x1c2hvcnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBHTHVpbnQ7Cit0eXBlZGVmIGZsb2F0IEdMZmxvYXQ7Cit0eXBlZGVmIGZsb2F0IEdMY2xhbXBmOwordHlwZWRlZiB2b2lkIEdMdm9pZDsKK3R5cGVkZWYgaW50IEdMaW50cHRyQVJCOwordHlwZWRlZiBpbnQgR0xzaXplaXB0ckFSQjsKK3R5cGVkZWYgaW50IEdMZml4ZWQ7Cit0eXBlZGVmIGludCBHTGNsYW1weDsKKy8qIEludGVybmFsIGNvbnZlbmllbmNlIHR5cGVkZWZzICovCit0eXBlZGVmIHZvaWQgKCpfR0xmdW5jcHRyKSgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRXh0ZW5zaW9ucyAqLworI2RlZmluZSBHTF9PRVNfVkVSU0lPTl8xXzAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHTF9PRVNfcmVhZF9mb3JtYXQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlIDEKKworLyogQ2xlYXJCdWZmZXJNYXNrICovCisjZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVCAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAweDAwMDA0MDAwCisKKy8qIEJvb2xlYW4gKi8KKyNkZWZpbmUgR0xfRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworLyogQmVnaW5Nb2RlICovCisjZGVmaW5lIEdMX1BPSU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgR0xfTElORVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBHTF9MSU5FX0xPT1AgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEdMX0xJTkVfU1RSSVAgICAgICAgICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgR0xfVFJJQU5HTEVTICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBHTF9UUklBTkdMRV9TVFJJUCAgICAgICAgICAgICAgICAgMHgwMDA1CisjZGVmaW5lIEdMX1RSSUFOR0xFX0ZBTiAgICAgICAgICAgICAgICAgICAweDAwMDYKKworLyogQWxwaGFGdW5jdGlvbiAqLworI2RlZmluZSBHTF9ORVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIEdMX0xFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDEKKyNkZWZpbmUgR0xfRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMgorI2RlZmluZSBHTF9MRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAzCisjZGVmaW5lIEdMX0dSRUFURVIgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDQKKyNkZWZpbmUgR0xfTk9URVFVQUwgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNQorI2RlZmluZSBHTF9HRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA2CisjZGVmaW5lIEdMX0FMV0FZUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDcKKworLyogQmxlbmRpbmdGYWN0b3JEZXN0ICovCisjZGVmaW5lIEdMX1pFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdMX09ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdMX1NSQ19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgR0xfT05FX01JTlVTX1NSQ19DT0xPUiAgICAgICAgICAgIDB4MDMwMQorI2RlZmluZSBHTF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgMHgwMzAyCisjZGVmaW5lIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgICAgICAgICAgICAweDAzMDMKKyNkZWZpbmUgR0xfRFNUX0FMUEhBICAgICAgICAgICAgICAgICAgICAgIDB4MDMwNAorI2RlZmluZSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICAgICAgICAgICAgMHgwMzA1CisKKy8qIEJsZW5kaW5nRmFjdG9yU3JjICovCisvKiAgICAgIEdMX1pFUk8gKi8KKy8qICAgICAgR0xfT05FICovCisjZGVmaW5lIEdMX0RTVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAweDAzMDYKKyNkZWZpbmUgR0xfT05FX01JTlVTX0RTVF9DT0xPUiAgICAgICAgICAgIDB4MDMwNworI2RlZmluZSBHTF9TUkNfQUxQSEFfU0FUVVJBVEUgICAgICAgICAgICAgMHgwMzA4CisvKiAgICAgIEdMX1NSQ19BTFBIQSAqLworLyogICAgICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICovCisvKiAgICAgIEdMX0RTVF9BTFBIQSAqLworLyogICAgICBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICovCisKKy8qIENvbG9yTWF0ZXJpYWxGYWNlICovCisvKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCisKKy8qIENvbG9yTWF0ZXJpYWxQYXJhbWV0ZXIgKi8KKy8qICAgICAgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSAqLworCisvKiBDb2xvclBvaW50ZXJUeXBlICovCisvKiAgICAgIEdMX1VOU0lHTkVEX0JZVEUgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKworLyogQ3VsbEZhY2VNb2RlICovCisjZGVmaW5lIEdMX0ZST05UICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDQKKyNkZWZpbmUgR0xfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwNQorI2RlZmluZSBHTF9GUk9OVF9BTkRfQkFDSyAgICAgICAgICAgICAgICAgMHgwNDA4CisKKy8qIERlcHRoRnVuY3Rpb24gKi8KKy8qICAgICAgR0xfTkVWRVIgKi8KKy8qICAgICAgR0xfTEVTUyAqLworLyogICAgICBHTF9FUVVBTCAqLworLyogICAgICBHTF9MRVFVQUwgKi8KKy8qICAgICAgR0xfR1JFQVRFUiAqLworLyogICAgICBHTF9OT1RFUVVBTCAqLworLyogICAgICBHTF9HRVFVQUwgKi8KKy8qICAgICAgR0xfQUxXQVlTICovCisKKy8qIEVuYWJsZUNhcCAqLworI2RlZmluZSBHTF9GT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQjYwCisjZGVmaW5lIEdMX0xJR0hUSU5HICAgICAgICAgICAgICAgICAgICAgICAweDBCNTAKKyNkZWZpbmUgR0xfVEVYVFVSRV8yRCAgICAgICAgICAgICAgICAgICAgIDB4MERFMQorI2RlZmluZSBHTF9DVUxMX0ZBQ0UgICAgICAgICAgICAgICAgICAgICAgMHgwQjQ0CisjZGVmaW5lIEdMX0FMUEhBX1RFU1QgICAgICAgICAgICAgICAgICAgICAweDBCQzAKKyNkZWZpbmUgR0xfQkxFTkQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEJFMgorI2RlZmluZSBHTF9DT0xPUl9MT0dJQ19PUCAgICAgICAgICAgICAgICAgMHgwQkYyCisjZGVmaW5lIEdMX0RJVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAweDBCRDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9URVNUICAgICAgICAgICAgICAgICAgIDB4MEI5MAorI2RlZmluZSBHTF9ERVBUSF9URVNUICAgICAgICAgICAgICAgICAgICAgMHgwQjcxCisvKiAgICAgIEdMX0xJR0hUMCAqLworLyogICAgICBHTF9MSUdIVDEgKi8KKy8qICAgICAgR0xfTElHSFQyICovCisvKiAgICAgIEdMX0xJR0hUMyAqLworLyogICAgICBHTF9MSUdIVDQgKi8KKy8qICAgICAgR0xfTElHSFQ1ICovCisvKiAgICAgIEdMX0xJR0hUNiAqLworLyogICAgICBHTF9MSUdIVDcgKi8KKyNkZWZpbmUgR0xfUE9JTlRfU01PT1RIICAgICAgICAgICAgICAgICAgIDB4MEIxMAorI2RlZmluZSBHTF9MSU5FX1NNT09USCAgICAgICAgICAgICAgICAgICAgMHgwQjIwCisjZGVmaW5lIEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAweDBDMTEKKyNkZWZpbmUgR0xfQ09MT1JfTUFURVJJQUwgICAgICAgICAgICAgICAgIDB4MEI1NworI2RlZmluZSBHTF9OT1JNQUxJWkUgICAgICAgICAgICAgICAgICAgICAgMHgwQkExCisjZGVmaW5lIEdMX1JFU0NBTEVfTk9STUFMICAgICAgICAgICAgICAgICAweDgwM0EKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCAgICAgICAgICAgIDB4ODAzNworI2RlZmluZSBHTF9WRVJURVhfQVJSQVkgICAgICAgICAgICAgICAgICAgMHg4MDc0CisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWSAgICAgICAgICAgICAgICAgICAweDgwNzUKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVkgICAgICAgICAgICAgICAgICAgIDB4ODA3NgorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZICAgICAgICAgICAgMHg4MDc4CisjZGVmaW5lIEdMX01VTFRJU0FNUExFICAgICAgICAgICAgICAgICAgICAweDgwOUQKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFICAgICAgIDB4ODA5RQorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FICAgICAgICAgICAgMHg4MDlGCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRSAgICAgICAgICAgICAgICAweDgwQTAKKworLyogRXJyb3JDb2RlICovCisjZGVmaW5lIEdMX05PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdMX0lOVkFMSURfRU5VTSAgICAgICAgICAgICAgICAgICAweDA1MDAKKyNkZWZpbmUgR0xfSU5WQUxJRF9WQUxVRSAgICAgICAgICAgICAgICAgIDB4MDUwMQorI2RlZmluZSBHTF9JTlZBTElEX09QRVJBVElPTiAgICAgICAgICAgICAgMHgwNTAyCisjZGVmaW5lIEdMX1NUQUNLX09WRVJGTE9XICAgICAgICAgICAgICAgICAweDA1MDMKKyNkZWZpbmUgR0xfU1RBQ0tfVU5ERVJGTE9XICAgICAgICAgICAgICAgIDB4MDUwNAorI2RlZmluZSBHTF9PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgMHgwNTA1CisKKy8qIEZvZ01vZGUgKi8KKy8qICAgICAgR0xfTElORUFSICovCisjZGVmaW5lIEdMX0VYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgR0xfRVhQMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMQorCisvKiBGb2dQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfRk9HX0RFTlNJVFkgICAgICAgICAgICAgICAgICAgIDB4MEI2MgorI2RlZmluZSBHTF9GT0dfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgMHgwQjYzCisjZGVmaW5lIEdMX0ZPR19FTkQgICAgICAgICAgICAgICAgICAgICAgICAweDBCNjQKKyNkZWZpbmUgR0xfRk9HX01PREUgICAgICAgICAgICAgICAgICAgICAgIDB4MEI2NQorI2RlZmluZSBHTF9GT0dfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwQjY2CisKKy8qIEZyb250RmFjZURpcmVjdGlvbiAqLworI2RlZmluZSBHTF9DVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAwCisjZGVmaW5lIEdMX0NDVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDEKKworLyogR2V0UE5hbWUgKi8KKyNkZWZpbmUgR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgIDB4MEIxMgorI2RlZmluZSBHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRSAgICAgICAgMHgwQjIyCisjZGVmaW5lIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSAgICAgICAweDg0NkQKKyNkZWZpbmUgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFICAgICAgIDB4ODQ2RQorI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTIDB4OEI5QQorI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVMgMHg4QjlCCisjZGVmaW5lIEdMX01BWF9MSUdIVFMgICAgICAgICAgICAgICAgICAgICAweDBEMzEKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgIDB4MEQzMworI2RlZmluZSBHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgICAgMHgwRDM2CisjZGVmaW5lIEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICAgICAweDBEMzgKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgIDB4MEQzOQorI2RlZmluZSBHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgMHgwRDNBCisjZGVmaW5lIEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUyAgICAgICAgICAweDgwRTgKKyNkZWZpbmUgR0xfTUFYX0VMRU1FTlRTX0lORElDRVMgICAgICAgICAgIDB4ODBFOQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9VTklUUyAgICAgICAgICAgICAgMHg4NEUyCisjZGVmaW5lIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAweDg2QTIKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgICAgIDB4ODZBMworI2RlZmluZSBHTF9TVUJQSVhFTF9CSVRTICAgICAgICAgICAgICAgICAgMHgwRDUwCisjZGVmaW5lIEdMX1JFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAweDBENTIKKyNkZWZpbmUgR0xfR1JFRU5fQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1MworI2RlZmluZSBHTF9CTFVFX0JJVFMgICAgICAgICAgICAgICAgICAgICAgMHgwRDU0CisjZGVmaW5lIEdMX0FMUEhBX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTUKKyNkZWZpbmUgR0xfREVQVEhfQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NgorI2RlZmluZSBHTF9TVEVOQ0lMX0JJVFMgICAgICAgICAgICAgICAgICAgMHgwRDU3CisKKy8qIEhpbnRNb2RlICovCisjZGVmaW5lIEdMX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAgICAgICAweDExMDAKKyNkZWZpbmUgR0xfRkFTVEVTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMQorI2RlZmluZSBHTF9OSUNFU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAyCisKKy8qIEhpbnRUYXJnZXQgKi8KKyNkZWZpbmUgR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5UICAgIDB4MEM1MAorI2RlZmluZSBHTF9QT0lOVF9TTU9PVEhfSElOVCAgICAgICAgICAgICAgMHgwQzUxCisjZGVmaW5lIEdMX0xJTkVfU01PT1RIX0hJTlQgICAgICAgICAgICAgICAweDBDNTIKKyNkZWZpbmUgR0xfUE9MWUdPTl9TTU9PVEhfSElOVCAgICAgICAgICAgIDB4MEM1MworI2RlZmluZSBHTF9GT0dfSElOVCAgICAgICAgICAgICAgICAgICAgICAgMHgwQzU0CisKKy8qIExpZ2h0TW9kZWxQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAgICAgICAgICAgIDB4MEI1MworI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAgICAgICAgICAgMHgwQjUyCisKKy8qIExpZ2h0UGFyYW1ldGVyICovCisjZGVmaW5lIEdMX0FNQklFTlQgICAgICAgICAgICAgICAgICAgICAgICAweDEyMDAKKyNkZWZpbmUgR0xfRElGRlVTRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMQorI2RlZmluZSBHTF9TUEVDVUxBUiAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAyCisjZGVmaW5lIEdMX1BPU0lUSU9OICAgICAgICAgICAgICAgICAgICAgICAweDEyMDMKKyNkZWZpbmUgR0xfU1BPVF9ESVJFQ1RJT04gICAgICAgICAgICAgICAgIDB4MTIwNAorI2RlZmluZSBHTF9TUE9UX0VYUE9ORU5UICAgICAgICAgICAgICAgICAgMHgxMjA1CisjZGVmaW5lIEdMX1NQT1RfQ1VUT0ZGICAgICAgICAgICAgICAgICAgICAweDEyMDYKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQVRURU5VQVRJT04gICAgICAgICAgIDB4MTIwNworI2RlZmluZSBHTF9MSU5FQVJfQVRURU5VQVRJT04gICAgICAgICAgICAgMHgxMjA4CisjZGVmaW5lIEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiAgICAgICAgICAweDEyMDkKKworLyogRGF0YVR5cGUgKi8KKyNkZWZpbmUgR0xfQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMAorI2RlZmluZSBHTF9VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgMHgxNDAxCisjZGVmaW5lIEdMX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDIKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgIDB4MTQwMworI2RlZmluZSBHTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDA2CisjZGVmaW5lIEdMX0ZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MEMKKworLyogTG9naWNPcCAqLworI2RlZmluZSBHTF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTAwCisjZGVmaW5lIEdMX0FORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDEKKyNkZWZpbmUgR0xfQU5EX1JFVkVSU0UgICAgICAgICAgICAgICAgICAgIDB4MTUwMgorI2RlZmluZSBHTF9DT1BZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTAzCisjZGVmaW5lIEdMX0FORF9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAweDE1MDQKKyNkZWZpbmUgR0xfTk9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwNQorI2RlZmluZSBHTF9YT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA2CisjZGVmaW5lIEdMX09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDcKKyNkZWZpbmUgR0xfTk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwOAorI2RlZmluZSBHTF9FUVVJViAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA5CisjZGVmaW5lIEdMX0lOVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEEKKyNkZWZpbmUgR0xfT1JfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgIDB4MTUwQgorI2RlZmluZSBHTF9DT1BZX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgMHgxNTBDCisjZGVmaW5lIEdMX09SX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgICAweDE1MEQKKyNkZWZpbmUgR0xfTkFORCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwRQorI2RlZmluZSBHTF9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBGCisKKy8qIE1hdGVyaWFsRmFjZSAqLworLyogICAgICBHTF9GUk9OVF9BTkRfQkFDSyAqLworCisvKiBNYXRlcmlhbFBhcmFtZXRlciAqLworI2RlZmluZSBHTF9FTUlTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgMHgxNjAwCisjZGVmaW5lIEdMX1NISU5JTkVTUyAgICAgICAgICAgICAgICAgICAgICAweDE2MDEKKyNkZWZpbmUgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSAgICAgICAgICAgIDB4MTYwMgorLyogICAgICBHTF9BTUJJRU5UICovCisvKiAgICAgIEdMX0RJRkZVU0UgKi8KKy8qICAgICAgR0xfU1BFQ1VMQVIgKi8KKworLyogTWF0cml4TW9kZSAqLworI2RlZmluZSBHTF9NT0RFTFZJRVcgICAgICAgICAgICAgICAgICAgICAgMHgxNzAwCisjZGVmaW5lIEdMX1BST0pFQ1RJT04gICAgICAgICAgICAgICAgICAgICAweDE3MDEKKyNkZWZpbmUgR0xfVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTcwMgorCisvKiBOb3JtYWxQb2ludGVyVHlwZSAqLworLyogICAgICBHTF9CWVRFICovCisvKiAgICAgIEdMX1NIT1JUICovCisvKiAgICAgIEdMX0ZMT0FUICovCisvKiAgICAgIEdMX0ZJWEVEICovCisKKy8qIFBpeGVsRm9ybWF0ICovCisjZGVmaW5lIEdMX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDYKKyNkZWZpbmUgR0xfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwNworI2RlZmluZSBHTF9SR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA4CisjZGVmaW5lIEdMX0xVTUlOQU5DRSAgICAgICAgICAgICAgICAgICAgICAweDE5MDkKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBICAgICAgICAgICAgICAgIDB4MTkwQQorCisvKiBQaXhlbFN0b3JlUGFyYW1ldGVyICovCisjZGVmaW5lIEdMX1VOUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAweDBDRjUKKyNkZWZpbmUgR0xfUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAgIDB4MEQwNQorCisvKiBQaXhlbFR5cGUgKi8KKy8qICAgICAgR0xfVU5TSUdORURfQllURSAqLworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICAgICAgICAgMHg4MDMzCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgICAgICAgICAweDgwMzQKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV82XzUgICAgICAgICAgIDB4ODM2MworCisvKiBTaGFkaW5nTW9kZWwgKi8KKyNkZWZpbmUgR0xfRkxBVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUQwMAorI2RlZmluZSBHTF9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgMHgxRDAxCisKKy8qIFN0ZW5jaWxGdW5jdGlvbiAqLworLyogICAgICBHTF9ORVZFUiAqLworLyogICAgICBHTF9MRVNTICovCisvKiAgICAgIEdMX0VRVUFMICovCisvKiAgICAgIEdMX0xFUVVBTCAqLworLyogICAgICBHTF9HUkVBVEVSICovCisvKiAgICAgIEdMX05PVEVRVUFMICovCisvKiAgICAgIEdMX0dFUVVBTCAqLworLyogICAgICBHTF9BTFdBWVMgKi8KKworLyogU3RlbmNpbE9wICovCisvKiAgICAgIEdMX1pFUk8gKi8KKyNkZWZpbmUgR0xfS0VFUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMAorI2RlZmluZSBHTF9SRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAxCisjZGVmaW5lIEdMX0lOQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDIKKyNkZWZpbmUgR0xfREVDUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMworLyogICAgICBHTF9JTlZFUlQgKi8KKworLyogU3RyaW5nTmFtZSAqLworI2RlZmluZSBHTF9WRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAwCisjZGVmaW5lIEdMX1JFTkRFUkVSICAgICAgICAgICAgICAgICAgICAgICAweDFGMDEKKyNkZWZpbmUgR0xfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMgorI2RlZmluZSBHTF9FWFRFTlNJT05TICAgICAgICAgICAgICAgICAgICAgMHgxRjAzCisKKy8qIFRleENvb3JkUG9pbnRlclR5cGUgKi8KKy8qICAgICAgR0xfU0hPUlQgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKy8qICAgICAgR0xfQllURSAqLworCisvKiBUZXh0dXJlRW52TW9kZSAqLworI2RlZmluZSBHTF9NT0RVTEFURSAgICAgICAgICAgICAgICAgICAgICAgMHgyMTAwCisjZGVmaW5lIEdMX0RFQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAweDIxMDEKKy8qICAgICAgR0xfQkxFTkQgKi8KKyNkZWZpbmUgR0xfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNAorLyogICAgICBHTF9SRVBMQUNFICovCisKKy8qIFRleHR1cmVFbnZQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRV9FTlZfTU9ERSAgICAgICAgICAgICAgIDB4MjIwMAorI2RlZmluZSBHTF9URVhUVVJFX0VOVl9DT0xPUiAgICAgICAgICAgICAgMHgyMjAxCisKKy8qIFRleHR1cmVFbnZUYXJnZXQgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRV9FTlYgICAgICAgICAgICAgICAgICAgIDB4MjMwMAorCisvKiBUZXh0dXJlTWFnRmlsdGVyICovCisjZGVmaW5lIEdMX05FQVJFU1QgICAgICAgICAgICAgICAgICAgICAgICAweDI2MDAKKyNkZWZpbmUgR0xfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjYwMQorCisvKiBUZXh0dXJlTWluRmlsdGVyICovCisvKiAgICAgIEdMX05FQVJFU1QgKi8KKy8qICAgICAgR0xfTElORUFSICovCisjZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgICAgICAgICAweDI3MDAKKyNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICAgICAgICAgIDB4MjcwMQorI2RlZmluZSBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgICAgICAgICAgMHgyNzAyCisjZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSICAgICAgICAgICAweDI3MDMKKworLyogVGV4dHVyZVBhcmFtZXRlck5hbWUgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRV9NQUdfRklMVEVSICAgICAgICAgICAgIDB4MjgwMAorI2RlZmluZSBHTF9URVhUVVJFX01JTl9GSUxURVIgICAgICAgICAgICAgMHgyODAxCisjZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9TICAgICAgICAgICAgICAgICAweDI4MDIKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1QgICAgICAgICAgICAgICAgIDB4MjgwMworCisvKiBUZXh0dXJlVGFyZ2V0ICovCisvKiAgICAgIEdMX1RFWFRVUkVfMkQgKi8KKworLyogVGV4dHVyZVVuaXQgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRTAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMAorI2RlZmluZSBHTF9URVhUVVJFMSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMxCisjZGVmaW5lIEdMX1RFWFRVUkUyICAgICAgICAgICAgICAgICAgICAgICAweDg0QzIKKyNkZWZpbmUgR0xfVEVYVFVSRTMgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMworI2RlZmluZSBHTF9URVhUVVJFNCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM0CisjZGVmaW5lIEdMX1RFWFRVUkU1ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzUKKyNkZWZpbmUgR0xfVEVYVFVSRTYgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNgorI2RlZmluZSBHTF9URVhUVVJFNyAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM3CisjZGVmaW5lIEdMX1RFWFRVUkU4ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzgKKyNkZWZpbmUgR0xfVEVYVFVSRTkgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDOQorI2RlZmluZSBHTF9URVhUVVJFMTAgICAgICAgICAgICAgICAgICAgICAgMHg4NENBCisjZGVmaW5lIEdMX1RFWFRVUkUxMSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0IKKyNkZWZpbmUgR0xfVEVYVFVSRTEyICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQworI2RlZmluZSBHTF9URVhUVVJFMTMgICAgICAgICAgICAgICAgICAgICAgMHg4NENECisjZGVmaW5lIEdMX1RFWFRVUkUxNCAgICAgICAgICAgICAgICAgICAgICAweDg0Q0UKKyNkZWZpbmUgR0xfVEVYVFVSRTE1ICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRgorI2RlZmluZSBHTF9URVhUVVJFMTYgICAgICAgICAgICAgICAgICAgICAgMHg4NEQwCisjZGVmaW5lIEdMX1RFWFRVUkUxNyAgICAgICAgICAgICAgICAgICAgICAweDg0RDEKKyNkZWZpbmUgR0xfVEVYVFVSRTE4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMgorI2RlZmluZSBHTF9URVhUVVJFMTkgICAgICAgICAgICAgICAgICAgICAgMHg4NEQzCisjZGVmaW5lIEdMX1RFWFRVUkUyMCAgICAgICAgICAgICAgICAgICAgICAweDg0RDQKKyNkZWZpbmUgR0xfVEVYVFVSRTIxICAgICAgICAgICAgICAgICAgICAgIDB4ODRENQorI2RlZmluZSBHTF9URVhUVVJFMjIgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ2CisjZGVmaW5lIEdMX1RFWFRVUkUyMyAgICAgICAgICAgICAgICAgICAgICAweDg0RDcKKyNkZWZpbmUgR0xfVEVYVFVSRTI0ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOAorI2RlZmluZSBHTF9URVhUVVJFMjUgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ5CisjZGVmaW5lIEdMX1RFWFRVUkUyNiAgICAgICAgICAgICAgICAgICAgICAweDg0REEKKyNkZWZpbmUgR0xfVEVYVFVSRTI3ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQgorI2RlZmluZSBHTF9URVhUVVJFMjggICAgICAgICAgICAgICAgICAgICAgMHg4NERDCisjZGVmaW5lIEdMX1RFWFRVUkUyOSAgICAgICAgICAgICAgICAgICAgICAweDg0REQKKyNkZWZpbmUgR0xfVEVYVFVSRTMwICAgICAgICAgICAgICAgICAgICAgIDB4ODRERQorI2RlZmluZSBHTF9URVhUVVJFMzEgICAgICAgICAgICAgICAgICAgICAgMHg4NERGCisKKy8qIFRleHR1cmVXcmFwTW9kZSAqLworI2RlZmluZSBHTF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgyOTAxCisjZGVmaW5lIEdMX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgICAgICAweDgxMkYKKworLyogUGl4ZWxJbnRlcm5hbEZvcm1hdCAqLworI2RlZmluZSBHTF9QQUxFVFRFNF9SR0I4X09FUyAgICAgICAgICAgICAgMHg4QjkwCisjZGVmaW5lIEdMX1BBTEVUVEU0X1JHQkE4X09FUyAgICAgICAgICAgICAweDhCOTEKKyNkZWZpbmUgR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTICAgICAgICAgIDB4OEI5MgorI2RlZmluZSBHTF9QQUxFVFRFNF9SR0JBNF9PRVMgICAgICAgICAgICAgMHg4QjkzCisjZGVmaW5lIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTICAgICAgICAgICAweDhCOTQKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCOF9PRVMgICAgICAgICAgICAgIDB4OEI5NQorI2RlZmluZSBHTF9QQUxFVFRFOF9SR0JBOF9PRVMgICAgICAgICAgICAgMHg4Qjk2CisjZGVmaW5lIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUyAgICAgICAgICAweDhCOTcKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCQTRfT0VTICAgICAgICAgICAgIDB4OEI5OAorI2RlZmluZSBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUyAgICAgICAgICAgMHg4Qjk5CisKKy8qIFZlcnRleFBvaW50ZXJUeXBlICovCisvKiAgICAgIEdMX1NIT1JUICovCisvKiAgICAgIEdMX0ZMT0FUICovCisvKiAgICAgIEdMX0ZJWEVEICovCisvKiAgICAgIEdMX0JZVEUgKi8KKworLyogTGlnaHROYW1lICovCisjZGVmaW5lIEdMX0xJR0hUMCAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgR0xfTElHSFQxICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMQorI2RlZmluZSBHTF9MSUdIVDIgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAyCisjZGVmaW5lIEdMX0xJR0hUMyAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDMKKyNkZWZpbmUgR0xfTElHSFQ0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNAorI2RlZmluZSBHTF9MSUdIVDUgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA1CisjZGVmaW5lIEdMX0xJR0hUNiAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDYKKyNkZWZpbmUgR0xfTElHSFQ3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWN0aXZlVGV4dHVyZSAoR0xlbnVtIHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFscGhhRnVuYyAoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWxwaGFGdW5jeCAoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFRleHR1cmUgKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEZ1bmMgKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3Rvcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXIgKEdMYml0ZmllbGQgbWFzayk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJDb2xvciAoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyQ29sb3J4IChHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJEZXB0aGYgKEdMY2xhbXBmIGRlcHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckRlcHRoeCAoR0xjbGFtcHggZGVwdGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyU3RlbmNpbCAoR0xpbnQgcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xpZW50QWN0aXZlVGV4dHVyZSAoR0xlbnVtIHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yNGYgKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yNHggKEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yTWFzayAoR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclBvaW50ZXIgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleEltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEN1bGxGYWNlIChHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlVGV4dHVyZXMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhGdW5jIChHTGVudW0gZnVuYyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhNYXNrIChHTGJvb2xlYW4gZmxhZyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhSYW5nZWYgKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aFJhbmdleCAoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERpc2FibGUgKEdMZW51bSBjYXApOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERpc2FibGVDbGllbnRTdGF0ZSAoR0xlbnVtIGFycmF5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3QXJyYXlzIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdFbGVtZW50cyAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuYWJsZSAoR0xlbnVtIGNhcCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5hYmxlQ2xpZW50U3RhdGUgKEdMZW51bSBhcnJheSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmluaXNoICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGbHVzaCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nZiAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dmdiAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ3ggKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9neHYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcm9udEZhY2UgKEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcnVzdHVtZiAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJ1c3R1bXggKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblRleHR1cmVzIChHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMpOworR0xBUEkgR0xlbnVtIEFQSUVOVFJZIGdsR2V0RXJyb3IgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEludGVnZXJ2IChHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgY29uc3QgR0x1Ynl0ZSAqIEFQSUVOVFJZIGdsR2V0U3RyaW5nIChHTGVudW0gbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSGludCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0TW9kZWxmIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0TW9kZWxmdiAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0TW9kZWx4IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0TW9kZWx4diAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0ZiAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0ZnYgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0eCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0eHYgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpbmVXaWR0aCAoR0xmbG9hdCB3aWR0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGluZVdpZHRoeCAoR0xmaXhlZCB3aWR0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZElkZW50aXR5ICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkTWF0cml4ZiAoY29uc3QgR0xmbG9hdCAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZE1hdHJpeHggKGNvbnN0IEdMZml4ZWQgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvZ2ljT3AgKEdMZW51bSBvcGNvZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdGVyaWFsZiAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0ZXJpYWxmdiAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRlcmlhbHggKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdGVyaWFseHYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4TW9kZSAoR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRNYXRyaXhmIChjb25zdCBHTGZsb2F0ICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0TWF0cml4eCAoY29uc3QgR0xmaXhlZCAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRmIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0eCAoR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWwzZiAoR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsM3ggKEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFBvaW50ZXIgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xPcnRob2YgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE9ydGhveCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxTdG9yZWkgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50U2l6ZSAoR0xmbG9hdCBzaXplKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFNpemV4IChHTGZpeGVkIHNpemUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvbHlnb25PZmZzZXQgKEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0eCAoR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvcE1hdHJpeCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHVzaE1hdHJpeCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVhZFBpeGVscyAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUm90YXRlZiAoR0xmbG9hdCBhbmdsZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUm90YXRleCAoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2UgKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZXggKEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTY2FsZWYgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNjYWxleCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Npc3NvciAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNoYWRlTW9kZWwgKEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsRnVuYyAoR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxNYXNrIChHTHVpbnQgbWFzayk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbE9wIChHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkUG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEVudmYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4RW52ZnYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhFbnZ4IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEVudnh2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFBhcmFtZXRlcmYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4UGFyYW1ldGVyeCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVHJhbnNsYXRlZiAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVHJhbnNsYXRleCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4UG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZpZXdwb3J0IChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX2dsX2hfICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUJTRC50eHQgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUJTRC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyNGUzYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtQlNELnR4dApAQCAtMCwwICsxLDM0IEBACitUaGlzIGlzIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3IgdGhlICJTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiINCitPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlIHNvdXJjZSBjb2RlDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQ0KK0NvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBKZXRybyBMYXVoYQ0KK0FsbCByaWdodHMgcmVzZXJ2ZWQuDQorDQorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zDQorYXJlIG1ldDoNCisNCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbg0KKyAgICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisgICAgICBkaXN0cmlidXRpb24uDQorICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgc29mdHdhcmUgcHJvZHVjdCdzIGNvcHlyaWdodCBvd25lciBub3INCisgICAgICB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUNCisgICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4NCisgICAgICBwZXJtaXNzaW9uLg0KKw0KK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KK0EgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEDQorVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUg0KK1BST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YNCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUw0KK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtTEdQTC50eHQgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUxHUEwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZTNmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUxHUEwudHh0CkBAIC0wLDAgKzEsNTA0IEBACisJCSAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIuMSwgRmVicnVhcnkgMTk5OQorCisgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1tUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBMZXNzZXIgR1BMLiAgSXQgYWxzbyBjb3VudHMKKyBhcyB0aGUgc3VjY2Vzc29yIG9mIHRoZSBHTlUgTGlicmFyeSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBoZW5jZQorIHRoZSB2ZXJzaW9uIG51bWJlciAyLjEuXQorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQorZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgorCisgIFRoaXMgbGljZW5zZSwgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKK3NwZWNpYWxseSBkZXNpZ25hdGVkIHNvZnR3YXJlIHBhY2thZ2VzLS10eXBpY2FsbHkgbGlicmFyaWVzLS1vZiB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgb3RoZXIgYXV0aG9ycyB3aG8gZGVjaWRlIHRvIHVzZSBpdC4gIFlvdQorY2FuIHVzZSBpdCB0b28sIGJ1dCB3ZSBzdWdnZXN0IHlvdSBmaXJzdCB0aGluayBjYXJlZnVsbHkgYWJvdXQgd2hldGhlcgordGhpcyBsaWNlbnNlIG9yIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIHRoZSBiZXR0ZXIKK3N0cmF0ZWd5IHRvIHVzZSBpbiBhbnkgcGFydGljdWxhciBjYXNlLCBiYXNlZCBvbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tIG9mIHVzZSwKK25vdCBwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQKK3lvdSBoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UKK2ZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpOyB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQKK2l0IGlmIHlvdSB3YW50IGl0OyB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBhbmQgdXNlIHBpZWNlcyBvZgoraXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBhcmUgaW5mb3JtZWQgdGhhdCB5b3UgY2FuIGRvCit0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorZGlzdHJpYnV0b3JzIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGVzZQorcmlnaHRzLiAgVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yCit5b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5IG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKK29yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKK3lvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKK2NvZGUuICBJZiB5b3UgbGluayBvdGhlciBjb2RlIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKK2NvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cywgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQord2l0aCB0aGUgbGlicmFyeSBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKK2l0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCBhIHR3by1zdGVwIG1ldGhvZDogKDEpIHdlIGNvcHlyaWdodCB0aGUKK2xpYnJhcnksIGFuZCAoMikgd2Ugb2ZmZXIgeW91IHRoaXMgbGljZW5zZSwgd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCitwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KKworICBUbyBwcm90ZWN0IGVhY2ggZGlzdHJpYnV0b3IsIHdlIHdhbnQgdG8gbWFrZSBpdCB2ZXJ5IGNsZWFyIHRoYXQKK3RoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgZnJlZSBsaWJyYXJ5LiAgQWxzbywgaWYgdGhlIGxpYnJhcnkgaXMKK21vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB0aGUgcmVjaXBpZW50cyBzaG91bGQga25vdwordGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsIHZlcnNpb24sIHNvIHRoYXQgdGhlIG9yaWdpbmFsCithdXRob3IncyByZXB1dGF0aW9uIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHByb2JsZW1zIHRoYXQgbWlnaHQgYmUKK2ludHJvZHVjZWQgYnkgb3RoZXJzLgorDAorICBGaW5hbGx5LCBzb2Z0d2FyZSBwYXRlbnRzIHBvc2UgYSBjb25zdGFudCB0aHJlYXQgdG8gdGhlIGV4aXN0ZW5jZSBvZgorYW55IGZyZWUgcHJvZ3JhbS4gIFdlIHdpc2ggdG8gbWFrZSBzdXJlIHRoYXQgYSBjb21wYW55IGNhbm5vdAorZWZmZWN0aXZlbHkgcmVzdHJpY3QgdGhlIHVzZXJzIG9mIGEgZnJlZSBwcm9ncmFtIGJ5IG9idGFpbmluZyBhCityZXN0cmljdGl2ZSBsaWNlbnNlIGZyb20gYSBwYXRlbnQgaG9sZGVyLiAgVGhlcmVmb3JlLCB3ZSBpbnNpc3QgdGhhdAorYW55IHBhdGVudCBsaWNlbnNlIG9idGFpbmVkIGZvciBhIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbXVzdCBiZQorY29uc2lzdGVudCB3aXRoIHRoZSBmdWxsIGZyZWVkb20gb2YgdXNlIHNwZWNpZmllZCBpbiB0aGlzIGxpY2Vuc2UuCisKKyAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBsaWNlbnNlLCB0aGUgR05VIExlc3NlcgorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluIGRlc2lnbmF0ZWQgbGlicmFyaWVzLCBhbmQKK2lzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgV2UgdXNlCit0aGlzIGxpY2Vuc2UgZm9yIGNlcnRhaW4gbGlicmFyaWVzIGluIG9yZGVyIHRvIHBlcm1pdCBsaW5raW5nIHRob3NlCitsaWJyYXJpZXMgaW50byBub24tZnJlZSBwcm9ncmFtcy4KKworICBXaGVuIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCBhIGxpYnJhcnksIHdoZXRoZXIgc3RhdGljYWxseSBvciB1c2luZworYSBzaGFyZWQgbGlicmFyeSwgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gaXMgbGVnYWxseSBzcGVha2luZyBhCitjb21iaW5lZCB3b3JrLCBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnkuICBUaGUgb3JkaW5hcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhlcmVmb3JlIHBlcm1pdHMgc3VjaCBsaW5raW5nIG9ubHkgaWYgdGhlCitlbnRpcmUgY29tYmluYXRpb24gZml0cyBpdHMgY3JpdGVyaWEgb2YgZnJlZWRvbS4gIFRoZSBMZXNzZXIgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgcGVybWl0cyBtb3JlIGxheCBjcml0ZXJpYSBmb3IgbGlua2luZyBvdGhlciBjb2RlIHdpdGgKK3RoZSBsaWJyYXJ5LgorCisgIFdlIGNhbGwgdGhpcyBsaWNlbnNlIHRoZSAiTGVzc2VyIiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGJlY2F1c2UgaXQKK2RvZXMgTGVzcyB0byBwcm90ZWN0IHRoZSB1c2VyJ3MgZnJlZWRvbSB0aGFuIHRoZSBvcmRpbmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZS4gIEl0IGFsc28gcHJvdmlkZXMgb3RoZXIgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wZXJzIExlc3MKK29mIGFuIGFkdmFudGFnZSBvdmVyIGNvbXBldGluZyBub24tZnJlZSBwcm9ncmFtcy4gIFRoZXNlIGRpc2FkdmFudGFnZXMKK2FyZSB0aGUgcmVhc29uIHdlIHVzZSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbWFueQorbGlicmFyaWVzLiAgSG93ZXZlciwgdGhlIExlc3NlciBsaWNlbnNlIHByb3ZpZGVzIGFkdmFudGFnZXMgaW4gY2VydGFpbgorc3BlY2lhbCBjaXJjdW1zdGFuY2VzLgorCisgIEZvciBleGFtcGxlLCBvbiByYXJlIG9jY2FzaW9ucywgdGhlcmUgbWF5IGJlIGEgc3BlY2lhbCBuZWVkIHRvCitlbmNvdXJhZ2UgdGhlIHdpZGVzdCBwb3NzaWJsZSB1c2Ugb2YgYSBjZXJ0YWluIGxpYnJhcnksIHNvIHRoYXQgaXQgYmVjb21lcworYSBkZS1mYWN0byBzdGFuZGFyZC4gIFRvIGFjaGlldmUgdGhpcywgbm9uLWZyZWUgcHJvZ3JhbXMgbXVzdCBiZQorYWxsb3dlZCB0byB1c2UgdGhlIGxpYnJhcnkuICBBIG1vcmUgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IGEgZnJlZQorbGlicmFyeSBkb2VzIHRoZSBzYW1lIGpvYiBhcyB3aWRlbHkgdXNlZCBub24tZnJlZSBsaWJyYXJpZXMuICBJbiB0aGlzCitjYXNlLCB0aGVyZSBpcyBsaXR0bGUgdG8gZ2FpbiBieSBsaW1pdGluZyB0aGUgZnJlZSBsaWJyYXJ5IHRvIGZyZWUKK3NvZnR3YXJlIG9ubHksIHNvIHdlIHVzZSB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgSW4gb3RoZXIgY2FzZXMsIHBlcm1pc3Npb24gdG8gdXNlIGEgcGFydGljdWxhciBsaWJyYXJ5IGluIG5vbi1mcmVlCitwcm9ncmFtcyBlbmFibGVzIGEgZ3JlYXRlciBudW1iZXIgb2YgcGVvcGxlIHRvIHVzZSBhIGxhcmdlIGJvZHkgb2YKK2ZyZWUgc29mdHdhcmUuICBGb3IgZXhhbXBsZSwgcGVybWlzc2lvbiB0byB1c2UgdGhlIEdOVSBDIExpYnJhcnkgaW4KK25vbi1mcmVlIHByb2dyYW1zIGVuYWJsZXMgbWFueSBtb3JlIHBlb3BsZSB0byB1c2UgdGhlIHdob2xlIEdOVQorb3BlcmF0aW5nIHN5c3RlbSwgYXMgd2VsbCBhcyBpdHMgdmFyaWFudCwgdGhlIEdOVS9MaW51eCBvcGVyYXRpbmcKK3N5c3RlbS4KKworICBBbHRob3VnaCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgTGVzcyBwcm90ZWN0aXZlIG9mIHRoZQordXNlcnMnIGZyZWVkb20sIGl0IGRvZXMgZW5zdXJlIHRoYXQgdGhlIHVzZXIgb2YgYSBwcm9ncmFtIHRoYXQgaXMKK2xpbmtlZCB3aXRoIHRoZSBMaWJyYXJ5IGhhcyB0aGUgZnJlZWRvbSBhbmQgdGhlIHdoZXJld2l0aGFsIHRvIHJ1bgordGhhdCBwcm9ncmFtIHVzaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeS4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCisid29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQorZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGVyZWFzIHRoZSBsYXR0ZXIgbXVzdAorYmUgY29tYmluZWQgd2l0aCB0aGUgbGlicmFyeSBpbiBvcmRlciB0byBydW4uCisMCisJCSAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgb3Igb3RoZXIKK3Byb2dyYW0gd2hpY2ggY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yCitvdGhlciBhdXRob3JpemVkIHBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCit0aGlzIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuCitFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCitwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKyh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCisKKyAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKK3doaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCitjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQorcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAorc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcworaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKKworICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucworYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKK2ludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgorYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQorc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgord3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcworYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCisgIAorICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKK2NvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Cit5b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgorYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKK2FsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Cit3YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQorTGlicmFyeS4KKworICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAorYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQorZmVlLgorDAorICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCisgICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKKyAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCisgICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQorICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAorICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgorICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCisgICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgorCisgICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKKyAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCisgICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKKyAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAorICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCisgICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQoraXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKK3dpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KK3RoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KK3RoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKK2luc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKK3RoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KK3RoZXNlIG5vdGljZXMuCisMCisgIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKK3RoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCitzdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgorCisgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgordGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgorCisgIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCitkZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQordW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55CitpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCittdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKK3NvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bworZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQorTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgorbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKK3dvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKK3RoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQorY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Citjb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQorbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCitTZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KKworICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQordGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCitkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KK1doZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCitsaW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQordGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KKworICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQorc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCitmdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0CitmaWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCit3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQorTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKKworICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQorZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCitBbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKK3doZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KKwwKKyAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbWJpbmUgb3IKK2xpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCit3b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawordW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCitlbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KKworICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKK0xpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQordGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yaworZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKK2NvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKK2RpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKK29mIHRoZXNlIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCisgICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCisgICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKKyAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAorICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAorICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCisgICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKKyAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAorICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQorICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCisgICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCisKKyAgICBiKSBVc2UgYSBzdWl0YWJsZSBzaGFyZWQgbGlicmFyeSBtZWNoYW5pc20gZm9yIGxpbmtpbmcgd2l0aCB0aGUKKyAgICBMaWJyYXJ5LiAgQSBzdWl0YWJsZSBtZWNoYW5pc20gaXMgb25lIHRoYXQgKDEpIHVzZXMgYXQgcnVuIHRpbWUgYQorICAgIGNvcHkgb2YgdGhlIGxpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIgc3lzdGVtLAorICAgIHJhdGhlciB0aGFuIGNvcHlpbmcgbGlicmFyeSBmdW5jdGlvbnMgaW50byB0aGUgZXhlY3V0YWJsZSwgYW5kICgyKQorICAgIHdpbGwgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgaWYKKyAgICB0aGUgdXNlciBpbnN0YWxscyBvbmUsIGFzIGxvbmcgYXMgdGhlIG1vZGlmaWVkIHZlcnNpb24gaXMKKyAgICBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIHRoYXQgdGhlIHdvcmsgd2FzIG1hZGUgd2l0aC4KKworICAgIGMpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0CisgICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCisgICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQorICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KKworICAgIGQpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5CisgICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCisgICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgorCisgICAgZSkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCisgICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCisKKyAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCitMaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgorcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCit0aGUgbWF0ZXJpYWxzIHRvIGJlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcworbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCitjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCit3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCit0aGUgZXhlY3V0YWJsZS4KKworICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQorcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQorYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAordXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQorZGlzdHJpYnV0ZS4KKwwKKyAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKK2ZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKK2xpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgordGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCitwZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKKyAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5CisgICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgICAgU2VjdGlvbnMgYWJvdmUuCisKKyAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAorICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCisgICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgorCisgIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCit0aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQorYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKK3JpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKK29yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKK3Rlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQorc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgd2l0aAordGhpcyBMaWNlbnNlLgorDAorICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKK3BhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSwKK2FuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTIuIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgTGlicmFyeSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZAorYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsCitzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMKK2V4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCit3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICAxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKK3ZlcnNpb25zIG9mIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KK1N1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKK2J1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCisiYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCitsaWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKwwKKyAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAord3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKK2NvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCitkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCitvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZworYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCitXQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgorRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKK09USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCitLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCitMSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQorVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCitXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQorQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKK0ZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCitMSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCitSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQorRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgorU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0CitldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKK3JlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCisKKyAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcworc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQorImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKKyAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKKworCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLnR4dCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDg0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLnR4dApAQCAtMCwwICsxLDE5IEBACitTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlDQorQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQ0KK0FsbCByaWdodHMgcmVzZXJ2ZWQuDQorV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLw0KKw0KK1RoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOg0KKyAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlDQorICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQNCisgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyDQorICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQ0KKyAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4NCisgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluDQorICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0Lg0KKw0KK1RoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMNCitMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9zaGFwZXMuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL3NoYXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZmZhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9zaGFwZXMuaApAQCAtMCwwICsxLDU5IEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBzaGFwZXMuaCx2IDEuNiAyMDA1LzAxLzMxIDIyOjE1OjMwIHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNiAkCisgKi8KKworI2lmbmRlZiBTSEFQRVNfSF9JTkNMVURFRAorI2RlZmluZSBTSEFQRVNfSF9JTkNMVURFRAorCisKKyNkZWZpbmUgU1VQRVJTSEFQRV9QQVJBTVMgMTUKKworc3RhdGljIGNvbnN0IGZsb2F0IHNTdXBlclNoYXBlUGFyYW1zW11bU1VQRVJTSEFQRV9QQVJBTVNdID0KK3sKKyAgICAvLyBtICBhICAgICBiICAgICBuMSAgICAgIG4yICAgICBuMyAgICAgbSAgICAgYSAgICAgYiAgICAgbjEgICAgIG4yICAgICAgbjMgICByZXMxIHJlczIgc2NhbGUgIChvcmcucmVzMSxyZXMyKQorICAgIHsgMTAsIDEsICAgIDIsICAgIDkwLCAgICAgIDEsICAgLTQ1LCAgICA4LCAgICAxLCAgICAxLCAgICAtMSwgICAgIDEsICAtMC40ZiwgICAyMCwgIDMwLCAyIH0sIC8vIDQwLCA2MAorICAgIHsgMTAsIDEsICAgIDIsICAgIDkwLCAgICAgIDEsICAgLTQ1LCAgICA0LCAgICAxLCAgICAxLCAgICAxMCwgICAgIDEsICAtMC40ZiwgICAyMCwgIDIwLCA0IH0sIC8vIDQwLCA0MAorICAgIHsgMTAsIDEsICAgIDIsICAgIDYwLCAgICAgIDEsICAgLTEwLCAgICA0LCAgICAxLCAgICAxLCAgICAtMSwgICAgLTIsICAtMC40ZiwgICA0MSwgIDQxLCAxIH0sIC8vIDgyLCA4MgorICAgIHsgIDYsIDEsICAgIDEsICAgIDYwLCAgICAgIDEsICAgLTcwLCAgICA4LCAgICAxLCAgICAxLCAgMC40ZiwgICAgIDMsICAwLjI1ZiwgICAyMCwgIDIwLCAxIH0sIC8vIDQwLCA0MAorICAgIHsgIDQsIDEsICAgIDEsICAgIDMwLCAgICAgIDEsICAgIDIwLCAgIDEyLCAgICAxLCAgICAxLCAgMC40ZiwgICAgIDMsICAwLjI1ZiwgICAxMCwgIDMwLCAxIH0sIC8vIDIwLCA2MAorICAgIHsgIDgsIDEsICAgIDEsICAgIDMwLCAgICAgIDEsICAgIC00LCAgICA4LCAgICAyLCAgICAxLCAgICAtMSwgICAgIDUsICAgMC41ZiwgICAyNSwgIDI2LCAxIH0sIC8vIDYwLCA2MAorICAgIHsgMTMsIDEsICAgIDEsICAgIDMwLCAgICAgIDEsICAgIC00LCAgIDEzLCAgICAxLCAgICAxLCAgICAgMSwgICAgIDUsICAgICAgMSwgICAzMCwgIDMwLCA2IH0sIC8vIDYwLCA2MAorICAgIHsgMTAsIDEsIDEuMWYsIC0wLjVmLCAgIDAuMWYsICAgIDcwLCAgIDYwLCAgICAxLCAgICAxLCAgIC05MCwgICAgIDAsIC0wLjI1ZiwgICAyMCwgIDYwLCA4IH0sIC8vIDYwLCAxODAKKyAgICB7ICA3LCAxLCAgICAxLCAgICAyMCwgIC0wLjNmLCAtMy41ZiwgICAgNiwgICAgMSwgICAgMSwgICAgLTEsICA0LjVmLCAgIDAuNWYsICAgMTAsICAyMCwgNCB9LCAvLyA2MCwgODAKKyAgICB7ICA0LCAxLCAgICAxLCAgICAxMCwgICAgIDEwLCAgICAxMCwgICAgNCwgICAgMSwgICAgMSwgICAgMTAsICAgIDEwLCAgICAgMTAsICAgMTAsICAyMCwgMSB9LCAvLyAyMCwgNDAKKyAgICB7ICA0LCAxLCAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwgICAgNCwgICAgMSwgICAgMSwgICAgIDEsICAgICAxLCAgICAgIDEsICAgMTAsICAxMCwgMiB9LCAvLyAxMCwgMTAKKyAgICB7ICAxLCAxLCAgICAxLCAgICAzOCwgLTAuMjVmLCAgICAxOSwgICAgNCwgICAgMSwgICAgMSwgICAgMTAsICAgIDEwLCAgICAgMTAsICAgMTAsICAxNSwgMiB9LCAvLyAyMCwgNDAKKyAgICB7ICAyLCAxLCAgICAxLCAgMC43ZiwgICAwLjNmLCAgMC4yZiwgICAgMywgICAgMSwgICAgMSwgICAxMDAsICAgMTAwLCAgICAxMDAsICAgMTAsICAyNSwgMiB9LCAvLyAyMCwgNTAKKyAgICB7ICA2LCAxLCAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwgICAgMywgICAgMSwgICAgMSwgICAgIDEsICAgICAxLCAgICAgIDEsICAgMzAsICAzMCwgMiB9LCAvLyA2MCwgNjAKKyAgICB7ICAzLCAxLCAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwgICAgNiwgICAgMSwgICAgMSwgICAgIDIsICAgICAxLCAgICAgIDEsICAgMTAsICAyMCwgMiB9LCAvLyAyMCwgNDAKKyAgICB7ICA2LCAxLCAgICAxLCAgICAgNiwgICA1LjVmLCAgIDEwMCwgICAgNiwgICAgMSwgICAgMSwgICAgMjUsICAgIDEwLCAgICAgMTAsICAgMzAsICAyMCwgMiB9LCAvLyA2MCwgNDAKKyAgICB7ICAzLCAxLCAgICAxLCAgMC41ZiwgICAxLjdmLCAgMS43ZiwgICAgMiwgICAgMSwgICAgMSwgICAgMTAsICAgIDEwLCAgICAgMTAsICAgMjAsICAyMCwgMiB9LCAvLyA0MCwgNDAKKyAgICB7ICA1LCAxLCAgICAxLCAgMC4xZiwgICAxLjdmLCAgMS43ZiwgICAgMSwgICAgMSwgICAgMSwgIDAuM2YsICAwLjVmLCAgIDAuNWYsICAgMjAsICAyMCwgNCB9LCAvLyA0MCwgNDAKKyAgICB7ICAyLCAxLCAgICAxLCAgICAgNiwgICA1LjVmLCAgIDEwMCwgICAgNiwgICAgMSwgICAgMSwgICAgIDQsICAgIDEwLCAgICAgMTAsICAgMTAsICAyMiwgMSB9LCAvLyA0MCwgNDAKKyAgICB7ICA2LCAxLCAgICAxLCAgICAtMSwgICAgIDcwLCAgMC4xZiwgICAgOSwgICAgMSwgMC41ZiwgICAtOTgsIDAuMDVmLCAgICAtNDUsICAgMjAsICAzMCwgNCB9LCAvLyA2MCwgOTEKKyAgICB7ICA2LCAxLCAgICAxLCAgICAtMSwgICAgIDkwLCAtMC4xZiwgICAgNywgICAgMSwgICAgMSwgICAgOTAsICAxLjNmLCAgICAgMzQsICAgMTMsICAxNiwgMSB9LCAvLyAzMiwgNjAKK307CisjZGVmaW5lIFNVUEVSU0hBUEVfQ09VTlQgKHNpemVvZihzU3VwZXJTaGFwZVBhcmFtcykgLyBzaXplb2Yoc1N1cGVyU2hhcGVQYXJhbXNbMF0pKQorCisKKyNlbmRpZiAvLyAhU0hBUEVTX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9maWx0ZXIvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9maWx0ZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDQ4ZjBkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2ZpbHRlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTcgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwlmaWx0ZXIuYworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorICAgIGxpYkVHTCBcCisgICAgbGliR0xFU3YxX0NNIFwKKyAgICBsaWJ1aQorCitMT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1maWx0ZXIKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZmlsdGVyL2ZpbHRlci5jIGIvb3BlbmdsL3Rlc3RzL2ZpbHRlci9maWx0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTk3MTE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2ZpbHRlci9maWx0ZXIuYwpAQCAtMCwwICsxLDEzMCBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIGlmIChhcmdjIT0yICYmIGFyZ2MhPTMpIHsKKyAgICAgICAgcHJpbnRmKCJ1c2FnZTogJXMgPDAtNj4gW3BidWZmZXJdXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIGNvbnN0IGludCB0ZXN0ID0gYXRvaShhcmd2WzFdKTsKKyAgICBpbnQgdXNlUGJ1ZmZlciA9IGFyZ2M9PTMgJiYgIXN0cmNtcChhcmd2WzJdLCAicGJ1ZmZlciIpOworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9QQlVGRkVSX0JJVHxFR0xfV0lORE9XX0JJVCwKKyAgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgNSwKKyAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCAgICAgNiwKKyAgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgNSwKKyAgICAgICAgIEVHTF9OT05FCisgICAgIH07CisgICAgIAorICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xOworICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgICBFR0xDb25maWcgY29uZmlnOworICAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKyAgICAgRUdMaW50IHcsIGg7CisgICAgIAorICAgICBFR0xEaXNwbGF5IGRweTsKKworICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgIGVnbENob29zZUNvbmZpZyhkcHksIHNfY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAgICBpZiAoIXVzZVBidWZmZXIpIHsKKyAgICAgICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgY29uZmlnLAorICAgICAgICAgICAgICAgICBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCksIE5VTEwpOworICAgICB9IGVsc2UgeworICAgICAgICAgcHJpbnRmKCJ1c2luZyBwYnVmZmVyXG4iKTsKKyAgICAgICAgIEVHTGludCBhdHRyaWJzW10gPSB7IEVHTF9XSURUSCwgMzIwLCBFR0xfSEVJR0hULCA0ODAsIEVHTF9OT05FIH07CisgICAgICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoZHB5LCBjb25maWcsIGF0dHJpYnMpOworICAgICAgICAgaWYgKHN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpIHsKKyAgICAgICAgICAgICBwcmludGYoImVnbENyZWF0ZVBidWZmZXJTdXJmYWNlIGVycm9yICV4XG4iLCBlZ2xHZXRFcnJvcigpKTsKKyAgICAgICAgIH0KKyAgICAgfQorICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7CisgICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7ICAgCisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOworICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7CisgICAgIEdMaW50IGRpbSA9IHc8aCA/IHcgOiBoOworCisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgNCwgNCwgLTQgfTsKKyAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOworICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKKyAgICAgZ2xDb2xvcjRmKDEsMSwxLDEpOworCisgICAgIC8vIHBhY2tpbmcgaXMgYWx3YXlzIDQKKyAgICAgdWludDhfdCB0OFtdICA9IHsgCisgICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCisgICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiwKKyAgICAgICAgICAgICAweDAwLCAweDU1LCAweDAwLCAweDU1LCAKKyAgICAgICAgICAgICAweEFBLCAweEZGLCAweEFBLCAweEZGICB9OworCisgICAgIHVpbnQxNl90IHQxNltdICA9IHsgCisgICAgICAgICAgICAgMHgwMDAwLCAweDU1NTUsIDB4MDAwMCwgMHg1NTU1LCAKKyAgICAgICAgICAgICAweEFBQUEsIDB4RkZGRiwgMHhBQUFBLCAweEZGRkYsCisgICAgICAgICAgICAgMHgwMDAwLCAweDU1NTUsIDB4MDAwMCwgMHg1NTU1LCAKKyAgICAgICAgICAgICAweEFBQUEsIDB4RkZGRiwgMHhBQUFBLCAweEZGRkYgIH07CisKKyAgICAgdWludDE2X3QgdDU1NTFbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgCisgICAgICAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLAorICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgCisgICAgICAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAwICB9OworCisgICAgIHVpbnQzMl90IHQzMltdICA9IHsgCisgICAgICAgICAgICAgMHhGRjAwMDAwMCwgMHhGRjAwMDBGRiwgMHhGRjAwRkYwMCwgMHhGRkZGMDAwMCwgCisgICAgICAgICAgICAgMHhGRjAwRkYwMCwgMHhGRkZGMDAwMCwgMHhGRjAwMDAwMCwgMHhGRjAwMDBGRiwgCisgICAgICAgICAgICAgMHhGRjAwRkZGRiwgMHhGRjAwRkYwMCwgMHgwMEZGMDBGRiwgMHhGRkZGRkYwMCwgCisgICAgICAgICAgICAgMHhGRjAwMDAwMCwgMHhGRkZGMDBGRiwgMHhGRjAwRkZGRiwgMHhGRkZGRkZGRgorICAgICB9OworCisgICAgIHN3aXRjaCh0ZXN0KSAKKyAgICAgeworICAgICBjYXNlIDE6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfTFVNSU5BTkNFLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9MVU1JTkFOQ0UsIEdMX1VOU0lHTkVEX0JZVEUsIHQ4KTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDI6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCB0MTYpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgMzoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80LCB0MTYpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgNDoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9MVU1JTkFOQ0VfQUxQSEEsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX0xVTUlOQU5DRV9BTFBIQSwgR0xfVU5TSUdORURfQllURSwgdDE2KTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDU6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSwgdDU1NTEpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgNjoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCB0MzIpOworICAgICAgICAgYnJlYWs7CisgICAgIH0KKworICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIGRpbSwgZGltKTsKKworICAgICBpZiAoIXVzZVBidWZmZXIpIHsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0gZWxzZSB7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICB9CisgICAgIAorICAgICBlZ2xUZXJtaW5hdGUoZHB5KTsKKyAgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZmluaXNoL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZmluaXNoL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY4MzZjMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9maW5pc2gvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE3IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJZmluaXNoLmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKyAgICBsaWJFR0wgXAorICAgIGxpYkdMRVN2MV9DTSBcCisgICAgbGlidWkKKworTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZmluaXNoCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9maW5pc2guYyBiL29wZW5nbC90ZXN0cy9maW5pc2gvZmluaXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmYzc1OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9maW5pc2gvZmluaXNoLmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorCisKK2xvbmcgbG9uZyBzeXN0ZW1UaW1lKCkKK3sKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdDsKKyAgICB0LnR2X3NlYyA9IHQudHZfbnNlYyA9IDA7CisgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0KTsKKyAgICByZXR1cm4gKGxvbmcgbG9uZykodC50dl9zZWMpKjEwMDAwMDAwMDBMTCArIHQudHZfbnNlYzsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgNSwKKyAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCAgICAgNiwKKyAgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgNSwKKyAgICAgICAgIEVHTF9OT05FCisgICAgIH07CisgICAgIAorICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xOworICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgICBFR0xDb25maWcgY29uZmlnOworICAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKyAgICAgRUdMaW50IHcsIGg7CisgICAgIAorICAgICBFR0xEaXNwbGF5IGRweTsKKworICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgIGVnbENob29zZUNvbmZpZyhkcHksIHNfY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywgCisgICAgICAgICAgICAgYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpLCBOVUxMKTsKKyAgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBjb25maWcsIE5VTEwsIE5VTEwpOworICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOyAgIAorICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOworICAgICBHTGludCBkaW0gPSB3PGggPyB3IDogaDsKKworICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7CisgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOworICAgICBnbENvbG9yNGYoMSwxLDEsMSk7CisgICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworICAgICBnbFNoYWRlTW9kZWwoR0xfRkxBVCk7CisKKyAgICAgbG9uZyBsb25nIG5vdywgdDsKKyAgICAgaW50IGk7CisKKyAgICAgY2hhciogdGV4ZWxzID0gbWFsbG9jKDUxMio1MTIqMik7CisgICAgIG1lbXNldCh0ZXhlbHMsMHhGRiw1MTIqNTEyKjIpOworICAgICAKKyAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwKKyAgICAgICAgICAgICA1MTIsIDUxMiwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgdGV4ZWxzKTsKKworICAgICBjaGFyKiBkc3QgPSBtYWxsb2MoMzIwKjQ4MCoyKTsKKyAgICAgbWVtc2V0KGRzdCwgMCwgMzIwKjQ4MCoyKTsKKyAgICAgcHJpbnRmKCIzMDcyMDAgYnl0ZXMgbWVtY3B5XG4iKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIG1lbWNweShkc3QsIHRleGVscywgMzIwKjQ4MCoyKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoIm1lbWNweSgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgIH0KKyAgICAgZnJlZShkc3QpOworCisgICAgIGZyZWUodGV4ZWxzKTsKKworICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIC0yMCk7CisgICAgIAorICAgICBwcmludGYoIjUxMng1MTIgdW5tb2RpZmllZCB0ZXh0dXJlLCA1MTJ4NTEyIGJsaXQ6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDUxMiwgNTEyLCAtNTEyIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisgICAgIAorICAgICBwcmludGYoIjUxMng1MTIgdW5tb2RpZmllZCB0ZXh0dXJlLCAxeDEgYmxpdDpcbiIpOworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgMSwgMSwgLTEgfTsKKyAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorICAgICAKKyAgICAgcHJpbnRmKCI1MTJ4NTEyIHVubW9kaWZpZWQgdGV4dHVyZSwgNTEyeDUxMiBibGl0ICh4Mik6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDUxMiwgNTEyLCAtNTEyIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgNTEyLCA1MTIpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0KKworICAgICBwcmludGYoIjUxMng1MTIgdW5tb2RpZmllZCB0ZXh0dXJlLCAxeDEgYmxpdCAoeDIpOlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCAxLCAxLCAtMSB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCAxLCAxKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorCisgICAgIAorICAgICBwcmludGYoIjUxMng1MTIgKDF4MSB0ZXhlbCBNT0RJRklFRCB0ZXh0dXJlKSwgNTEyeDUxMiBibGl0OlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICB1aW50MTZfdCBncmVlbiA9IDB4N0UwOworICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgNTEyLCA1MTIsIC01MTIgfTsKKyAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCAwLCAwLCAxLCAxLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCAmZ3JlZW4pOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorCisKKyAgICAgaW50MTZfdCB0ZXhlbCA9IDB4RjgwMDsKKyAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwKKyAgICAgICAgICAgICAxLCAxLCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCAmdGV4ZWwpOworCisgICAgIHByaW50ZigiMXgxIHVubW9kaWZpZWQgdGV4dHVyZSwgMXgxIGJsaXQ6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDEsIDEpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisKKyAgICAgcHJpbnRmKCIxeDEgdW5tb2RpZmllZCB0ZXh0dXJlLCA1MTJ4NTEyIGJsaXQ6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisKKyAgICAgcHJpbnRmKCIxeDEgKDF4MSB0ZXhlbCBNT0RJRklFRCB0ZXh0dXJlKSwgNTEyeDUxMiBibGl0OlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICB1aW50MTZfdCBncmVlbiA9IDB4N0UwOworICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgMSwgMSwgLTEgfTsKKyAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCAwLCAwLCAxLCAxLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCAmZ3JlZW4pOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCAxLCAxKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisKKyAgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy90ZXh0dXJlcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YzYyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE3IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJdGV4dHVyZXMuYworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorICAgIGxpYkVHTCBcCisgICAgbGliR0xFU3YxX0NNIFwKKyAgICBsaWJ1aQorCitMT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC10ZXh0dXJlcworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXh0dXJlcy90ZXh0dXJlcy5jIGIvb3BlbmdsL3Rlc3RzL3RleHR1cmVzL3RleHR1cmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0MjkxYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXh0dXJlcy90ZXh0dXJlcy5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgICBFR0xfUkVEX1NJWkUsICAgICAgIDUsCisgICAgICAgICBFR0xfR1JFRU5fU0laRSwgICAgIDYsCisgICAgICAgICBFR0xfQkxVRV9TSVpFLCAgICAgIDUsCisgICAgICAgICBFR0xfTk9ORQorICAgICB9OworICAgICAKKyAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMTsKKyAgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKKyAgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKKyAgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICAgRUdMQ29udGV4dCBjb250ZXh0OworICAgICBFR0xTdXJmYWNlIHN1cmZhY2U7CisgICAgIEVHTGludCB3LCBoOworICAgICAKKyAgICAgRUdMRGlzcGxheSBkcHk7CisKKyAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworICAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBzX2NvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKKyAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsCisgICAgICAgICAgICAgYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpLCBOVUxMKTsKKyAgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBjb25maWcsIE5VTEwsIE5VTEwpOworICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOyAgIAorICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOworICAgICBHTGludCBkaW0gPSB3PGggPyB3IDogaDsKKworCisgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDQsIDQsIC00IH07CisgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7CisgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKKyAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7CisgICAgIGdsQ29sb3I0ZigxLDEsMSwxKTsKKworICAgICAvLyBwYWNraW5nIGlzIGFsd2F5cyA0CisgICAgIHVpbnQ4X3QgdDhbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAsIDB4NTUsIDB4MDAsIDB4NTUsIAorICAgICAgICAgICAgIDB4QUEsIDB4RkYsIDB4QUEsIDB4RkYsCisgICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCisgICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiAgfTsKKworICAgICB1aW50MTZfdCB0MTZbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCisgICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGLAorICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCisgICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGICB9OworCisgICAgIHVpbnQxNl90IHQ1NTUxW10gID0geyAKKyAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAorICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwKKyAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAorICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCAgfTsKKworICAgICB1aW50MzJfdCB0MzJbXSAgPSB7IAorICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIAorICAgICAgICAgICAgIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIAorICAgICAgICAgICAgIDB4RkYwMEZGRkYsIDB4RkYwMEZGMDAsIDB4MDBGRjAwRkYsIDB4RkZGRkZGMDAsIAorICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkZGRjAwRkYsIDB4RkYwMEZGRkYsIDB4RkZGRkZGRkYKKyAgICAgfTsKKworCisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9MVU1JTkFOQ0UsIDQsIDQsIDAsIEdMX0xVTUlOQU5DRSwgR0xfVU5TSUdORURfQllURSwgdDgpOworICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIGRpbS8yLCBkaW0vMik7CisKKyAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwgNCwgNCwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgdDE2KTsKKyAgICAgZ2xEcmF3VGV4aU9FUyhkaW0vMiwgMCwgMCwgZGltLzIsIGRpbS8yKTsKKworICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCwgdDE2KTsKKyAgICAgZ2xEcmF3VGV4aU9FUygwLCBkaW0vMiwgMCwgZGltLzIsIGRpbS8yKTsKKworICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgdDMyKTsKKyAgICAgZ2xEcmF3VGV4aU9FUyhkaW0vMiwgZGltLzIsIDAsIGRpbS8yLCBkaW0vMik7CisKKyAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdHJpdGV4L0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvdHJpdGV4L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkMWYwNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90cml0ZXgvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE3IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJdHJpdGV4LmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKyAgICBsaWJFR0wgXAorICAgIGxpYkdMRVN2MV9DTSBcCisgICAgbGlidWkKKworTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtdHJpdGV4CisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3RyaXRleC90cml0ZXguYyBiL29wZW5nbC90ZXN0cy90cml0ZXgvdHJpdGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhN2ZlYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90cml0ZXgvdHJpdGV4LmMKQEAgLTAsMCArMSwyNzMgQEAKKy8vIENhbGxzIGdsRHJhd0VsZW1lbnRzKCkgdGhlIG51bWJlciBvZiB0aW1lcyBzcGVjaWZpZWQgYnkKKy8vIElURVJBVElPTlMuIFNob3VsZCBkcmF3IGEgY2hlY2tlcmJvYXJkIG9uIHRoZSBzY3JlZW4gYWZ0ZXIKKy8vIGEgZmV3IHNlY29uZHMuCisvLworLy8gUG9ydGVkIGZyb20gYSBKYXZhIHZlcnNpb24gYnkgR29vZ2xlLgorCisjaW5jbHVkZSA8RUdML2VnbC5oPg0KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisNCitFR0xEaXNwbGF5IGVnbERpc3BsYXk7DQorRUdMU3VyZmFjZSBlZ2xTdXJmYWNlOw0KK0VHTENvbnRleHQgZWdsQ29udGV4dDsNCitHTHVpbnQgdGV4dHVyZTsNCisNCisjZGVmaW5lIEZJWEVEX09ORSAweDEwMDAwCisjZGVmaW5lIElURVJBVElPTlMgNTANCisNCitpbnQgaW5pdF9nbF9zdXJmYWNlKHZvaWQpOw0KK3ZvaWQgZnJlZV9nbF9zdXJmYWNlKHZvaWQpOw0KK3ZvaWQgaW5pdF9zY2VuZSh2b2lkKTsNCit2b2lkIHJlbmRlcihpbnQgcXVhZHMpOw0KK3ZvaWQgY3JlYXRlX3RleHR1cmUodm9pZCk7CitpbnQgcmVhZFRpbWVyKHZvaWQpOw0KKworc3RhdGljIHZvaWQgZ2x1TG9va0F0KGZsb2F0IGV5ZVgsIGZsb2F0IGV5ZVksIGZsb2F0IGV5ZVosCisgICAgICAgIGZsb2F0IGNlbnRlclgsIGZsb2F0IGNlbnRlclksIGZsb2F0IGNlbnRlclosIGZsb2F0IHVwWCwgZmxvYXQgdXBZLAorICAgICAgICBmbG9hdCB1cFopCit7CisgICAgLy8gU2VlIHRoZSBPcGVuR0wgR0xVVCBkb2N1bWVudGF0aW9uIGZvciBnbHVMb29rQXQgZm9yIGEgZGVzY3JpcHRpb24KKyAgICAvLyBvZiB0aGUgYWxnb3JpdGhtLiBXZSBpbXBsZW1lbnQgaXQgaW4gYSBzdHJhaWdodGZvcndhcmQgd2F5OgorCisgICAgZmxvYXQgZnggPSBjZW50ZXJYIC0gZXllWDsKKyAgICBmbG9hdCBmeSA9IGNlbnRlclkgLSBleWVZOworICAgIGZsb2F0IGZ6ID0gY2VudGVyWiAtIGV5ZVo7CisKKyAgICAvLyBOb3JtYWxpemUgZgorICAgIGZsb2F0IHJsZiA9IDEuMGYgLyBzcXJ0ZihmeCpmeCArIGZ5KmZ5ICsgZnoqZnopOworICAgIGZ4ICo9IHJsZjsKKyAgICBmeSAqPSBybGY7CisgICAgZnogKj0gcmxmOworCisgICAgLy8gTm9ybWFsaXplIHVwCisgICAgZmxvYXQgcmx1cCA9IDEuMGYgLyBzcXJ0Zih1cFgqdXBYICsgdXBZKnVwWSArIHVwWip1cFopOworICAgIHVwWCAqPSBybHVwOworICAgIHVwWSAqPSBybHVwOworICAgIHVwWiAqPSBybHVwOworCisgICAgLy8gY29tcHV0ZSBzID0gZiB4IHVwICh4IG1lYW5zICJjcm9zcyBwcm9kdWN0IikKKworICAgIGZsb2F0IHN4ID0gZnkgKiB1cFogLSBmeiAqIHVwWTsKKyAgICBmbG9hdCBzeSA9IGZ6ICogdXBYIC0gZnggKiB1cFo7CisgICAgZmxvYXQgc3ogPSBmeCAqIHVwWSAtIGZ5ICogdXBYOworCisgICAgLy8gY29tcHV0ZSB1ID0gcyB4IGYKKyAgICBmbG9hdCB1eCA9IHN5ICogZnogLSBzeiAqIGZ5OworICAgIGZsb2F0IHV5ID0gc3ogKiBmeCAtIHN4ICogZno7CisgICAgZmxvYXQgdXogPSBzeCAqIGZ5IC0gc3kgKiBmeDsKKworICAgIGZsb2F0IG1bMTZdIDsKKyAgICBtWzBdID0gc3g7CisgICAgbVsxXSA9IHV4OworICAgIG1bMl0gPSAtZng7CisgICAgbVszXSA9IDAuMGY7CisKKyAgICBtWzRdID0gc3k7CisgICAgbVs1XSA9IHV5OworICAgIG1bNl0gPSAtZnk7CisgICAgbVs3XSA9IDAuMGY7CisKKyAgICBtWzhdID0gc3o7CisgICAgbVs5XSA9IHV6OworICAgIG1bMTBdID0gLWZ6OworICAgIG1bMTFdID0gMC4wZjsKKworICAgIG1bMTJdID0gMC4wZjsKKyAgICBtWzEzXSA9IDAuMGY7CisgICAgbVsxNF0gPSAwLjBmOworICAgIG1bMTVdID0gMS4wZjsKKworICAgIGdsTXVsdE1hdHJpeGYobSk7CisgICAgZ2xUcmFuc2xhdGVmKC1leWVYLCAtZXllWSwgLWV5ZVopOworfQorDQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQ0KK3sNCisgICAgaW50IHE7CisgICAgaW50IHN0YXJ0LCBlbmQ7DQorCisgICAgcHJpbnRmKCJJbml0aWFsaXppbmcgRUdMLi4uXG4iKTsKKw0KKyAgICBpZighaW5pdF9nbF9zdXJmYWNlKCkpDQorICAgIHsNCisgICAgICAgIHByaW50ZigiR0wgaW5pdGlhbGlzYXRpb24gZmFpbGVkIC0gZXhpdGluZ1xuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBpbml0X3NjZW5lKCk7DQorDQorICAgIGNyZWF0ZV90ZXh0dXJlKCk7DQorDQorICAgIHByaW50ZigiU3RhcnQgdGVzdC4uLlxuIik7CisKKyAgICByZW5kZXIoYXJnYz09MiA/IGF0b2koYXJndlsxXSkgOiBJVEVSQVRJT05TKTsNCisNCisgICAgZnJlZV9nbF9zdXJmYWNlKCk7DQorDQorICAgIHJldHVybiAwOw0KK30NCisNCitpbnQgaW5pdF9nbF9zdXJmYWNlKHZvaWQpDQorew0KKyAgICBFR0xpbnQgbnVtQ29uZmlncyA9IDE7DQorICAgIEVHTENvbmZpZyBteUNvbmZpZyA9IHswfTsNCisgICAgRUdMaW50IGF0dHJpYltdID0NCisgICAgew0KKyAgICAgICAgICAgIEVHTF9ERVBUSF9TSVpFLCAgICAgMTYsDQorICAgICAgICAgICAgRUdMX05PTkUNCisgICAgfTsNCisNCisgICAgaWYgKCAoZWdsRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSkpID09IEVHTF9OT19ESVNQTEFZICkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJlZ2xHZXREaXNwbGF5IGZhaWxlZFxuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBpZiAoIGVnbEluaXRpYWxpemUoZWdsRGlzcGxheSwgTlVMTCwgTlVMTCkgIT0gRUdMX1RSVUUgKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoImVnbEluaXRpYWxpemUgZmFpbGVkXG4iKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIGlmICggZWdsQ2hvb3NlQ29uZmlnKGVnbERpc3BsYXksIGF0dHJpYiwgJm15Q29uZmlnLCAxLCAmbnVtQ29uZmlncykgIT0gRUdMX1RSVUUgKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoImVnbENob29zZUNvbmZpZyBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKCAoZWdsU3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZWdsRGlzcGxheSwgbXlDb25maWcsCisgICAgICAgICAgICBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCksIDApKSA9PSBFR0xfTk9fU1VSRkFDRSApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsQ3JlYXRlV2luZG93U3VyZmFjZSBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKCAoZWdsQ29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZWdsRGlzcGxheSwgbXlDb25maWcsIDAsIDApKSA9PSBFR0xfTk9fQ09OVEVYVCApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsQ3JlYXRlQ29udGV4dCBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKCBlZ2xNYWtlQ3VycmVudChlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlLCBlZ2xTdXJmYWNlLCBlZ2xDb250ZXh0KSAhPSBFR0xfVFJVRSApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsTWFrZUN1cnJlbnQgZmFpbGVkXG4iKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIHJldHVybiAxOw0KK30NCisNCit2b2lkIGZyZWVfZ2xfc3VyZmFjZSh2b2lkKQ0KK3sNCisgICAgaWYgKGVnbERpc3BsYXkgIT0gRUdMX05PX0RJU1BMQVkpDQorICAgIHsNCisgICAgICAgIGVnbE1ha2VDdXJyZW50KCBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NVUkZBQ0UsDQorICAgICAgICAgICAgICAgIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fQ09OVEVYVCApOw0KKyAgICAgICAgZWdsRGVzdHJveUNvbnRleHQoIGVnbERpc3BsYXksIGVnbENvbnRleHQgKTsNCisgICAgICAgIGVnbERlc3Ryb3lTdXJmYWNlKCBlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlICk7DQorICAgICAgICBlZ2xUZXJtaW5hdGUoIGVnbERpc3BsYXkgKTsNCisgICAgICAgIGVnbERpc3BsYXkgPSBFR0xfTk9fRElTUExBWTsNCisgICAgfQ0KK30NCisNCit2b2lkIGluaXRfc2NlbmUodm9pZCkNCit7DQorICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisKKyAgICBmbG9hdCByYXRpbyA9IDMyMC4wZiAvIDQ4MC4wZjsKKyAgICBnbFZpZXdwb3J0KDAsIDAsIDMyMCwgNDgwKTsKKworICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgICBnbExvYWRJZGVudGl0eSgpOworICAgIGdsRnJ1c3R1bWYoLXJhdGlvLCByYXRpbywgLTEsIDEsIDEsIDEwKTsKKworICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOw0KKyAgICBnbExvYWRJZGVudGl0eSgpOworICAgIGdsdUxvb2tBdCgKKyAgICAgICAgICAgIDAsIDAsIDMsICAvLyBleWUKKyAgICAgICAgICAgIDAsIDAsIDAsICAvLyBjZW50ZXIKKyAgICAgICAgICAgIDAsIDEsIDApOyAvLyB1cAorDQorICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOw0KKyAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7DQorICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Cit9DQorDQordm9pZCBjcmVhdGVfdGV4dHVyZSh2b2lkKQ0KK3sNCisgICAgY29uc3QgdW5zaWduZWQgaW50IG9uID0gMHhmZjAwMDBmZjsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgb2ZmID0gMHhmZmZmZmZmZjsKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgcGl4ZWxzW10gPQorICAgIHsKKyAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCisgICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAorICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKKyAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCisgICAgICAgICAgICBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLAorICAgICAgICAgICAgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwKKyAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCisgICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAorICAgIH07DQorICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmUpOw0KKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOw0KKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgOCwgOCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgcGl4ZWxzKTsNCisgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7DQorICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOw0KKyAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOw0KK30NCisNCit2b2lkIHJlbmRlcihpbnQgcXVhZHMpDQorew0KKyAgICBpbnQgaSwgajsNCisNCisgICAgY29uc3QgR0xmbG9hdCB2ZXJ0aWNlc1tdID0gew0KKyAgICAgICAgICAgIC0xLCAgLTEsICAwLA0KKyAgICAgICAgICAgICAxLCAgLTEsICAwLA0KKyAgICAgICAgICAgICAxLCAgIDEsICAwLA0KKyAgICAgICAgICAgIC0xLCAgIDEsICAwDQorICAgIH07DQorDQorICAgIGNvbnN0IEdMZml4ZWQgdGV4Q29vcmRzW10gPSB7DQorICAgICAgICAgICAgMCwgICAgICAgICAgICAwLA0KKyAgICAgICAgICAgIEZJWEVEX09ORSwgICAgMCwNCisgICAgICAgICAgICBGSVhFRF9PTkUsICAgIEZJWEVEX09ORSwNCisgICAgICAgICAgICAwLCAgICAgICAgICAgIEZJWEVEX09ORQ0KKyAgICB9Ow0KKw0KKyAgICBjb25zdCBHTHVzaG9ydCB0ZW1wbGF0ZVtdID0geyAwLCAxLCAyLCAgMCwgMiwgMyB9OworCisKKyAgICBHTHVzaG9ydCogaW5kaWNlcyA9IChHTHVzaG9ydCopbWFsbG9jKHF1YWRzKnNpemVvZih0ZW1wbGF0ZSkpOworICAgIGZvciAoaT0wIDsgaTxxdWFkcyA7IGkrKykKKyAgICAgICAgbWVtY3B5KGluZGljZXMrKHNpemVvZih0ZW1wbGF0ZSkvc2l6ZW9mKGluZGljZXNbMF0pKSppLCB0ZW1wbGF0ZSwgc2l6ZW9mKHRlbXBsYXRlKSk7CisNCisgICAgZ2xWZXJ0ZXhQb2ludGVyKDMsIEdMX0ZMT0FULCAwLCB2ZXJ0aWNlcyk7DQorICAgIGdsVGV4Q29vcmRQb2ludGVyKDIsIEdMX0ZJWEVELCAwLCB0ZXhDb29yZHMpOworCisgICAgLy8gbWFrZSBzdXJlIHRvIGRvIGEgY291cGxlIGVnbFN3YXBCdWZmZXJzIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUKKyAgICAvLyBubyBwcm9ibGVtcyB3aXRoIHRoZSB2ZXJ5IGZpcnN0IG9uZXMgKHdobyBrbm93cykKKyAgICBnbENsZWFyQ29sb3IoMC40LCAwLjQsIDAuNCwgMC40KTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICBlZ2xTd2FwQnVmZmVycyhlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlKTsKKyAgICBnbENsZWFyQ29sb3IoMC42LCAwLjYsIDAuNiwgMC42KTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICBlZ2xTd2FwQnVmZmVycyhlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlKTsKKyAgICBnbENsZWFyQ29sb3IoMS4wLCAxLjAsIDEuMCwgMS4wKTsKKworICAgIGZvciAoaj0wIDsgajwxMCA7IGorKykgeworICAgICAgICBwcmludGYoImxvb3AgJWQgLyAxMCAoJWQgcXVhZHMgLyBsb29wKVxuIiwgaiwgcXVhZHMpOworCisgICAgICAgIGludCBuZWxlbSA9IHNpemVvZih0ZW1wbGF0ZSkvc2l6ZW9mKHRlbXBsYXRlWzBdKTsKKyAgICAgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgbmVsZW0qcXVhZHMsIEdMX1VOU0lHTkVEX1NIT1JULCBpbmRpY2VzKTsKKyAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZWdsRGlzcGxheSwgZWdsU3VyZmFjZSk7CisgICAgfQorCisgICAgZnJlZShpbmRpY2VzKTsNCit9DQorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2VuIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dlbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYzQ5ODYxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dlbgpAQCAtMCwwICsxLDk5IEBACisjIS9iaW4vc2gKK3JtIC1yZiBvdXQgZ2VuZXJhdGVkCisKK21rZGlyIG91dAorbWtkaXIgLXAgb3V0L2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzCitta2RpciAtcCBvdXQvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pCitta2RpciAtcCBvdXQvYW5kcm9pZC9ncmFwaGljcworCitlY2hvICJwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7IiA+IG91dC9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCitlY2hvICJwdWJsaWMgaW50ZXJmYWNlIENhbnZhcyB7fSIgPj4gb3V0L2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKKworR0xGSUxFPW91dC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhCitjcCBzdHVicy9HTEhlYWRlci5qYXZhLWlmICRHTEZJTEUKKworR0xHRU5fRklMRVM9IkNGdW5jLmphdmEgQ1R5cGUuamF2YSBDb2RlRW1pdHRlci5qYXZhIEdlbmVyYXRlR0wuamF2YSBKRnVuYy5qYXZhIEpUeXBlLmphdmEgSm5pQ29kZUVtaXR0ZXIuamF2YSBQYXJhbWV0ZXJDaGVja2VyLmphdmEiCisKK3B1c2hkIHNyYyA+IC9kZXYvbnVsbAoramF2YWMgJHtHTEdFTl9GSUxFU30KK3BvcGQgPiAvZGV2L251bGwKK2phdmEgLWNsYXNzcGF0aCBzcmMgR2VuZXJhdGVHTCAtYyBnbHNwZWMtMS4wIGdsc3BlYy0xLjBleHQgZ2xzcGVjLTEuMSBnbHNwZWMtMS4xZXh0IGdsc3BlYy0xLjFleHRwYWNrIGdsc3BlYy1jaGVja3MKKworcHVzaGQgb3V0ID4gL2Rldi9udWxsCitta2RpciBjbGFzc2VzCitqYXZhYyAtZCBjbGFzc2VzIGNvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YSBqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwLmphdmEgamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMEV4dC5qYXZhIGphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YSBqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0LmphdmEgamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dGVuc2lvblBhY2suamF2YQorcG9wZCA+IC9kZXYvbnVsbAorCitybSAtcmYgZ2VuZXJhdGVkCitta2RpciAtcCBnZW5lcmF0ZWQvQworY3Agb3V0L2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIGdlbmVyYXRlZC9DCitjcCAtciBvdXQvY29tIGdlbmVyYXRlZAorY3AgLXIgb3V0L2phdmF4IGdlbmVyYXRlZAorCitybSAtcmYgb3V0CisKKyMgY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAKK2lmIGNtcCAuLi8uLi8uLi9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAgZ2VuZXJhdGVkL0MvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAgOyB0aGVuCitlY2hvIGNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi8uLi9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9DL2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIC4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2puaQorZmkKKworIyBHTEltcGwuamF2YQoraWYgY21wIC4uLy4uL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbC5qYXZhIGdlbmVyYXRlZC9jb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsLmphdmEgOyB0aGVuCitlY2hvIEdMSW1wbC5qYXZhIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YQorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YSAuLi8uLi9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaQorZmkKKworIyBHTC5qYXZhCitpZiBjbXAgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhIDsgdGhlbgorZWNobyBHTC5qYXZhIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMLmphdmEKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wuamF2YQorZmkKKworIyBHTDEwLmphdmEKK2lmIGNtcCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTAuamF2YSBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhIDsgdGhlbgorZWNobyBHTDEwLmphdmEgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhCitlY2hvIFBsZWFzZSBjcCBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhCitmaQorCisjIEdMMTBFeHQuamF2YQoraWYgY21wIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMEV4dC5qYXZhIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEgOyB0aGVuCitlY2hvIEdMMTBFeHQuamF2YSB1bmNoYW5nZWQKK2Vsc2UKK2VjaG8gUGxlYXNlIGVkaXQgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEKK2ZpCisKKyMgR0wxMS5qYXZhCitpZiBjbXAgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExLmphdmEgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YSA7IHRoZW4KK2VjaG8gR0wxMS5qYXZhIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YQorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YSAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YQorZmkKKworIyBHTDExRXh0LmphdmEKK2lmIGNtcCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHQuamF2YSBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhIDsgdGhlbgorZWNobyBHTDExRXh0LmphdmEgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhCitlY2hvIFBsZWFzZSBjcCBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhCitmaQorCisjIEdMMTFFeHRlbnNpb25QYWNrLmphdmEKK2lmIGNtcCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEgOyB0aGVuCitlY2hvIEdMMTFFeHRlbnNpb25QYWNrLmphdmEgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dGVuc2lvblBhY2suamF2YQorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0ZW5zaW9uUGFjay5qYXZhCitmaQorCitybSAtcmYgZ2VuZXJhdGVkCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMCBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NDIzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMApAQCAtMCwwICsxLDEwNiBAQAordm9pZCBnbEFjdGl2ZVRleHR1cmUgKCBHTGVudW0gdGV4dHVyZSApDQordm9pZCBnbEFscGhhRnVuYyAoIEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYgKQ0KK3ZvaWQgZ2xBbHBoYUZ1bmN4ICggR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZiApDQordm9pZCBnbEJpbmRUZXh0dXJlICggR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUgKQ0KK3ZvaWQgZ2xCbGVuZEZ1bmMgKCBHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IgKQ0KK3ZvaWQgZ2xDbGVhciAoIEdMYml0ZmllbGQgbWFzayApDQordm9pZCBnbENsZWFyQ29sb3IgKCBHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSApDQordm9pZCBnbENsZWFyQ29sb3J4ICggR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEgKQ0KK3ZvaWQgZ2xDbGVhckRlcHRoZiAoIEdMY2xhbXBmIGRlcHRoICkNCit2b2lkIGdsQ2xlYXJEZXB0aHggKCBHTGNsYW1weCBkZXB0aCApDQordm9pZCBnbENsZWFyU3RlbmNpbCAoIEdMaW50IHMgKQ0KK3ZvaWQgZ2xDbGllbnRBY3RpdmVUZXh0dXJlICggR0xlbnVtIHRleHR1cmUgKQ0KK3ZvaWQgZ2xDb2xvcjRmICggR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSApDQordm9pZCBnbENvbG9yNHggKCBHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhICkNCit2b2lkIGdsQ29sb3JNYXNrICggR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhICkNCit2b2lkIGdsQ29sb3JQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KK3ZvaWQgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQ0KK3ZvaWQgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApDQordm9pZCBnbENvcHlUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciApDQordm9pZCBnbENvcHlUZXhTdWJJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCit2b2lkIGdsQ3VsbEZhY2UgKCBHTGVudW0gbW9kZSApDQordm9pZCBnbERlbGV0ZVRleHR1cmVzICggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzICkNCit2b2lkIGdsRGVwdGhGdW5jICggR0xlbnVtIGZ1bmMgKQ0KK3ZvaWQgZ2xEZXB0aE1hc2sgKCBHTGJvb2xlYW4gZmxhZyApDQordm9pZCBnbERlcHRoUmFuZ2VmICggR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIgKQ0KK3ZvaWQgZ2xEZXB0aFJhbmdleCAoIEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyICkNCit2b2lkIGdsRGlzYWJsZSAoIEdMZW51bSBjYXAgKQ0KK3ZvaWQgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgKCBHTGVudW0gYXJyYXkgKQ0KK3ZvaWQgZ2xEcmF3QXJyYXlzICggR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50ICkNCit2b2lkIGdsRHJhd0VsZW1lbnRzICggR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMgKQ0KK3ZvaWQgZ2xFbmFibGUgKCBHTGVudW0gY2FwICkNCit2b2lkIGdsRW5hYmxlQ2xpZW50U3RhdGUgKCBHTGVudW0gYXJyYXkgKQ0KK3ZvaWQgZ2xGaW5pc2ggKCB2b2lkICkNCit2b2lkIGdsRmx1c2ggKCB2b2lkICkNCit2b2lkIGdsRm9nZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQordm9pZCBnbEZvZ2Z2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xGb2d4ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkNCit2b2lkIGdsRm9neHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbEZyb250RmFjZSAoIEdMZW51bSBtb2RlICkNCit2b2lkIGdsRnJ1c3R1bWYgKCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyICkNCit2b2lkIGdsRnJ1c3R1bXggKCBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyICkNCit2b2lkIGdsR2VuVGV4dHVyZXMgKCBHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMgKQ0KK0dMZW51bSBnbEdldEVycm9yICggdm9pZCApDQordm9pZCBnbEdldEludGVnZXJ2ICggR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCitjb25zdCBHTHVieXRlICogZ2xHZXRTdHJpbmcgKCBHTGVudW0gbmFtZSApDQordm9pZCBnbEhpbnQgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSApDQordm9pZCBnbExpZ2h0TW9kZWxmICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCit2b2lkIGdsTGlnaHRNb2RlbGZ2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xMaWdodE1vZGVseCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbExpZ2h0TW9kZWx4diAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsTGlnaHRmICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KK3ZvaWQgZ2xMaWdodGZ2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbExpZ2h0eCAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkNCit2b2lkIGdsTGlnaHR4diAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xMaW5lV2lkdGggKCBHTGZsb2F0IHdpZHRoICkNCit2b2lkIGdsTGluZVdpZHRoeCAoIEdMZml4ZWQgd2lkdGggKQ0KK3ZvaWQgZ2xMb2FkSWRlbnRpdHkgKCB2b2lkICkNCit2b2lkIGdsTG9hZE1hdHJpeGYgKCBjb25zdCBHTGZsb2F0ICptICkNCit2b2lkIGdsTG9hZE1hdHJpeHggKCBjb25zdCBHTGZpeGVkICptICkNCit2b2lkIGdsTG9naWNPcCAoIEdMZW51bSBvcGNvZGUgKQ0KK3ZvaWQgZ2xNYXRlcmlhbGYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCit2b2lkIGdsTWF0ZXJpYWxmdiAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbE1hdGVyaWFseCAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQ0KK3ZvaWQgZ2xNYXRlcmlhbHh2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsTWF0cml4TW9kZSAoIEdMZW51bSBtb2RlICkNCit2b2lkIGdsTXVsdE1hdHJpeGYgKCBjb25zdCBHTGZsb2F0ICptICkNCit2b2lkIGdsTXVsdE1hdHJpeHggKCBjb25zdCBHTGZpeGVkICptICkNCit2b2lkIGdsTXVsdGlUZXhDb29yZDRmICggR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxICkNCit2b2lkIGdsTXVsdGlUZXhDb29yZDR4ICggR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxICkNCit2b2lkIGdsTm9ybWFsM2YgKCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56ICkNCit2b2lkIGdsTm9ybWFsM3ggKCBHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56ICkNCit2b2lkIGdsTm9ybWFsUG9pbnRlciAoIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkNCit2b2lkIGdsT3J0aG9mICggR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciApDQordm9pZCBnbE9ydGhveCAoIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIgKQ0KK3ZvaWQgZ2xQaXhlbFN0b3JlaSAoIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQ0KK3ZvaWQgZ2xQb2ludFNpemUgKCBHTGZsb2F0IHNpemUgKQ0KK3ZvaWQgZ2xQb2ludFNpemV4ICggR0xmaXhlZCBzaXplICkNCit2b2lkIGdsUG9seWdvbk9mZnNldCAoIEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzICkNCit2b2lkIGdsUG9seWdvbk9mZnNldHggKCBHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyApDQordm9pZCBnbFBvcE1hdHJpeCAoIHZvaWQgKQ0KK3ZvaWQgZ2xQdXNoTWF0cml4ICggdm9pZCApDQordm9pZCBnbFJlYWRQaXhlbHMgKCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzICkNCit2b2lkIGdsUm90YXRlZiAoIEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKQ0KK3ZvaWQgZ2xSb3RhdGV4ICggR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiApDQordm9pZCBnbFNhbXBsZUNvdmVyYWdlICggR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQgKQ0KK3ZvaWQgZ2xTYW1wbGVDb3ZlcmFnZXggKCBHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCApDQordm9pZCBnbFNjYWxlZiAoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKQ0KK3ZvaWQgZ2xTY2FsZXggKCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6ICkNCit2b2lkIGdsU2Npc3NvciAoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCit2b2lkIGdsU2hhZGVNb2RlbCAoIEdMZW51bSBtb2RlICkNCit2b2lkIGdsU3RlbmNpbEZ1bmMgKCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayApDQordm9pZCBnbFN0ZW5jaWxNYXNrICggR0x1aW50IG1hc2sgKQ0KK3ZvaWQgZ2xTdGVuY2lsT3AgKCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MgKQ0KK3ZvaWQgZ2xUZXhDb29yZFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQordm9pZCBnbFRleEVudmYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KK3ZvaWQgZ2xUZXhFbnZmdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsVGV4RW52eCAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbFRleEVudnh2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMgKQ0KK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJmICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCit2b2lkIGdsVGV4UGFyYW1ldGVyeCAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbFRleFN1YkltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyApDQordm9pZCBnbFRyYW5zbGF0ZWYgKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkNCit2b2lkIGdsVHJhbnNsYXRleCAoIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHogKQ0KK3ZvaWQgZ2xWZXJ0ZXhQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KK3ZvaWQgZ2xWaWV3cG9ydCAoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMGV4dCBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4wZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMTk3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMGV4dApAQCAtMCwwICsxIEBACitHTGJpdGZpZWxkIGdsUXVlcnlNYXRyaXh4T0VTICggR0xmaXhlZCAqbWFudGlzc2EsIEdMaW50ICpleHBvbmVudCApDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTQ5YTdmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjEKQEAgLTAsMCArMSw0MiBAQAordm9pZCBnbEJpbmRCdWZmZXIgKCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyICkNCit2b2lkIGdsQnVmZmVyRGF0YSAoIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UgKQ0KK3ZvaWQgZ2xCdWZmZXJTdWJEYXRhICggR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApDQordm9pZCBnbENsaXBQbGFuZWYgKCBHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uICkNCit2b2lkIGdsQ2xpcFBsYW5leCAoIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24gKQ0KK3ZvaWQgZ2xDb2xvcjR1YiAoIEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEgKQ0KK3ZvaWQgZ2xDb2xvclBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQordm9pZCBnbERlbGV0ZUJ1ZmZlcnMgKCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYnVmZmVycyApDQordm9pZCBnbERyYXdFbGVtZW50cyAoIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgR0xpbnQgb2Zmc2V0ICkNCit2b2lkIGdsR2VuQnVmZmVycyAoIEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzICkNCit2b2lkIGdsR2V0Qm9vbGVhbnYgKCBHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zICkNCit2b2lkIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRDbGlwUGxhbmVmICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICplcW4gKQ0KK3ZvaWQgZ2xHZXRDbGlwUGxhbmV4ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkICplcW4gKQ0KK3ZvaWQgZ2xHZXRGaXhlZHYgKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbEdldEZsb2F0diAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsR2V0TGlnaHRmdiAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRMaWdodHh2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbEdldE1hdGVyaWFsZnYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRNYXRlcmlhbHh2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsR2V0VGV4RW52aXYgKCBHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRUZXhFbnZ4diAoIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsR2V0VGV4UGFyYW1ldGVyZnYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbEdldFRleFBhcmFtZXRlcml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCit2b2lkIGdsR2V0VGV4UGFyYW1ldGVyeHYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQorR0xib29sZWFuIGdsSXNCdWZmZXIgKCBHTHVpbnQgYnVmZmVyICkNCitHTGJvb2xlYW4gZ2xJc0VuYWJsZWQgKCBHTGVudW0gY2FwICkNCitHTGJvb2xlYW4gZ2xJc1RleHR1cmUgKCBHTHVpbnQgdGV4dHVyZSApDQordm9pZCBnbE5vcm1hbFBvaW50ZXIgKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQordm9pZCBnbFBvaW50UGFyYW1ldGVyZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQordm9pZCBnbFBvaW50UGFyYW1ldGVyZnYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbFBvaW50UGFyYW1ldGVyeCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbFBvaW50UGFyYW1ldGVyeHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbFBvaW50U2l6ZVBvaW50ZXJPRVMgKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQordm9pZCBnbFRleENvb3JkUG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkNCit2b2lkIGdsVGV4RW52aSAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQ0KK3ZvaWQgZ2xUZXhFbnZpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApDQordm9pZCBnbFRleFBhcmFtZXRlcmZ2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJpICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApDQordm9pZCBnbFRleFBhcmFtZXRlcml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zICkNCit2b2lkIGdsVGV4UGFyYW1ldGVyeHYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbFZlcnRleFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjFleHQgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMWV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzA4YzczCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjFleHQKQEAgLTAsMCArMSwxNiBAQAordm9pZCBnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTICggR0x1aW50IG1hdHJpeHBhbGV0dGVpbmRleCApDQordm9pZCBnbERyYXdUZXhmT0VTICggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3aWR0aCwgR0xmbG9hdCBoZWlnaHQgKQ0KK3ZvaWQgZ2xEcmF3VGV4ZnZPRVMgKCBjb25zdCBHTGZsb2F0ICpjb29yZHMgKQ0KK3ZvaWQgZ2xEcmF3VGV4aU9FUyAoIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQgKQ0KK3ZvaWQgZ2xEcmF3VGV4aXZPRVMgKCBjb25zdCBHTGludCAqY29vcmRzICkNCit2b2lkIGdsRHJhd1RleHNPRVMgKCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHdpZHRoLCBHTHNob3J0IGhlaWdodCApDQordm9pZCBnbERyYXdUZXhzdk9FUyAoIGNvbnN0IEdMc2hvcnQgKmNvb3JkcyApDQordm9pZCBnbERyYXdUZXh4T0VTICggR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiwgR0xmaXhlZCB3aWR0aCwgR0xmaXhlZCBoZWlnaHQgKQ0KK3ZvaWQgZ2xEcmF3VGV4eHZPRVMgKCBjb25zdCBHTGZpeGVkICpjb29yZHMgKQ0KK3ZvaWQgZ2xFbmFibGUgKCBHTGVudW0gY2FwICkNCit2b2lkIGdsRW5hYmxlQ2xpZW50U3RhdGUgKCBHTGVudW0gYXJyYXkgKQ0KK3ZvaWQgZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVMgKCB2b2lkICkNCit2b2lkIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KK3ZvaWQgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQordm9pZCBnbFdlaWdodFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQordm9pZCBnbFdlaWdodFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjFleHRwYWNrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjFleHRwYWNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOWU2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMWV4dHBhY2sKQEAgLTAsMCArMSwzOCBAQAordm9pZCBnbEJpbmRGcmFtZWJ1ZmZlck9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgZnJhbWVidWZmZXIgKQordm9pZCBnbEJpbmRSZW5kZXJidWZmZXJPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IHJlbmRlcmJ1ZmZlciApCit2b2lkIGdsQmluZFRleHR1cmUgKCBHTGludCB0YXJnZXQsIEdMaW50IHRleHR1cmUgKQordm9pZCBnbEJsZW5kRXF1YXRpb24gKCBHTGludCBtb2RlICkKK3ZvaWQgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUgKCBHTGludCBtb2RlUkdCLCBHTGludCBtb2RlQWxwaGEgKQordm9pZCBnbEJsZW5kRnVuY1NlcGFyYXRlICggR0xpbnQgc3JjUkdCLCBHTGludCBkc3RSR0IsIEdMaW50IHNyY0FscGhhLCBHTGludCBkc3RBbHBoYSApCitHTGludCBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMgKCBHTGludCB0YXJnZXQgKQordm9pZCBnbENvbXByZXNzZWRUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApCit2b2lkIGdsQ29weVRleEltYWdlMkQgKCBHTGludCB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCwgR0xpbnQgYm9yZGVyICkKK3ZvaWQgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMgKCBHTGludCBuLCBHTGludCAqZnJhbWVidWZmZXJzICkKK3ZvaWQgZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTICggR0xpbnQgbiwgR0xpbnQgKnJlbmRlcmJ1ZmZlcnMgKQordm9pZCBnbEVuYWJsZSAoIEdMaW50IGNhcCApCit2b2lkIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IGF0dGFjaG1lbnQsIEdMaW50IHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0xpbnQgcmVuZGVyYnVmZmVyICkKK3ZvaWQgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgYXR0YWNobWVudCwgR0xpbnQgdGV4dGFyZ2V0LCBHTGludCB0ZXh0dXJlLCBHTGludCBsZXZlbCApCit2b2lkIGdsR2VuZXJhdGVNaXBtYXBPRVMgKCBHTGludCB0YXJnZXQgKQordm9pZCBnbEdlbkZyYW1lYnVmZmVyc09FUyAoIEdMaW50IG4sIEdMaW50ICpmcmFtZWJ1ZmZlcnMgKQordm9pZCBnbEdlblJlbmRlcmJ1ZmZlcnNPRVMgKCBHTGludCBuLCBHTGludCAqcmVuZGVyYnVmZmVycyApCit2b2lkIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IGF0dGFjaG1lbnQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK3ZvaWQgZ2xHZXRJbnRlZ2VydiAoIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK3ZvaWQgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQordm9pZCBnbEdldFRleEdlbmZ2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQordm9pZCBnbEdldFRleEdlbml2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK3ZvaWQgZ2xHZXRUZXhHZW54diAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCitHTGJvb2xlYW4gZ2xJc0ZyYW1lYnVmZmVyT0VTICggR0xpbnQgZnJhbWVidWZmZXIgKQorR0xib29sZWFuIGdsSXNSZW5kZXJidWZmZXJPRVMgKCBHTGludCByZW5kZXJidWZmZXIgKQordm9pZCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0ICkKK3ZvaWQgZ2xTdGVuY2lsT3AgKCBHTGludCBmYWlsLCBHTGludCB6ZmFpbCwgR0xpbnQgenBhc3MgKQordm9pZCBnbFRleEVudmYgKCBHTGludCB0YXJnZXQsIEdMaW50IHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKK3ZvaWQgZ2xUZXhFbnZmdiAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApCit2b2lkIGdsVGV4RW52eCAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMaW50IHBhcmFtICkKK3ZvaWQgZ2xUZXhFbnZ4diAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQordm9pZCBnbFRleEdlbmYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQordm9pZCBnbFRleEdlbmZ2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQordm9pZCBnbFRleEdlbmkgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50IHBhcmFtICkKK3ZvaWQgZ2xUZXhHZW5pdiAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCit2b2lkIGdsVGV4R2VueCAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgcGFyYW0gKQordm9pZCBnbFRleEdlbnh2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJmICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xmbG9hdCBwYXJhbSApCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLWNoZWNrcyBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtY2hlY2tzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NGVkNjUzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy1jaGVja3MKQEAgLTAsMCArMSw1OSBAQAorZ2xDbGlwUGxhbmVmIGNoZWNrIGVxdWF0aW9uIDQNCitnbENsaXBQbGFuZXggY2hlY2sgZXF1YXRpb24gNA0KK2dsRGVsZXRlQnVmZmVycyBjaGVjayBidWZmZXJzIG4gDQorZ2xEZWxldGVUZXh0dXJlcyBjaGVjayB0ZXh0dXJlcyBuDQorZ2xEcmF3RWxlbWVudHMgY2hlY2tfQUlPT0JFIGluZGljZXMgY291bnQNCitnbEZvZyBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX0ZPR19NT0RFLEdMX0ZPR19ERU5TSVRZLEdMX0ZPR19TVEFSVCxHTF9GT0dfRU5EIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfRk9HX0NPTE9SDQorZ2xHZW5CdWZmZXJzIGNoZWNrIGJ1ZmZlcnMgbg0KK2dsR2VuVGV4dHVyZXMgY2hlY2sgdGV4dHVyZXMgbg0KK2dsR2V0Q2xpcFBsYW5lIGNoZWNrIGVxbiA0DQorZ2xHZXRJbnRlZ2VydiBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX0FMUEhBX0JJVFMsR0xfQUxQSEFfVEVTVF9GVU5DLEdMX0FMUEhBX1RFU1RfUkVGLEdMX0JMRU5EX0RTVCxHTF9CTFVFX0JJVFMsR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcsR0xfQ09MT1JfQVJSQVlfU0laRSxHTF9DT0xPUl9BUlJBWV9TVFJJREUsR0xfQ09MT1JfQVJSQVlfVFlQRSxHTF9DVUxMX0ZBQ0UsR0xfREVQVEhfQklUUyxHTF9ERVBUSF9DTEVBUl9WQUxVRSxHTF9ERVBUSF9GVU5DLEdMX0RFUFRIX1dSSVRFTUFTSyxHTF9GT0dfREVOU0lUWSxHTF9GT0dfRU5ELEdMX0ZPR19NT0RFLEdMX0ZPR19TVEFSVCxHTF9GUk9OVF9GQUNFLEdMX0dSRUVOX0JJVFMsR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTLEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVMsR0xfTElHSFRfTU9ERUxfVFdPX1NJREUsR0xfTElORV9TTU9PVEhfSElOVCxHTF9MSU5FX1dJRFRILEdMX0xPR0lDX09QX01PREUsR0xfTUFUUklYX0lOREVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU0laRV9PRVMsR0xfTUFUUklYX0lOREVYX0FSUkFZX1NUUklERV9PRVMsR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfT0VTLEdMX01BVFJJWF9NT0RFLEdMX01BWF9DTElQX1BMQU5FUyxHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUyxHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMsR0xfTUFYX0xJR0hUUyxHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRILEdMX01BWF9QQUxFVFRFX01BVFJJQ0VTX09FUyxHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSCxHTF9NQVhfVEVYVFVSRV9TSVpFLEdMX01BWF9URVhUVVJFX1NUQUNLX0RFUFRILEdMX01BWF9URVhUVVJFX1VOSVRTLEdMX01BWF9WRVJURVhfVU5JVFNfT0VTLEdMX01PREVMVklFV19TVEFDS19ERVBUSCxHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkcsR0xfTk9STUFMX0FSUkFZX1NUUklERSxHTF9OT1JNQUxfQVJSQVlfVFlQRSxHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMsR0xfUEFDS19BTElHTk1FTlQsR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULEdMX1BPSU5UX1NJWkUsR0xfUE9JTlRfU0laRV9BUlJBWV9CVUZGRVJfQklORElOR19PRVMsR0xfUE9JTlRfU0laRV9BUlJBWV9TVFJJREVfT0VTLEdMX1BPSU5UX1NJWkVfQVJSQVlfVFlQRV9PRVMsR0xfUE9JTlRfU01PT1RIX0hJTlQsR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SLEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTLEdMX1BST0pFQ1RJT05fU1RBQ0tfREVQVEgsR0xfUkVEX0JJVFMsR0xfU0hBREVfTU9ERUwsR0xfU1RFTkNJTF9CSVRTLEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUsR0xfU1RFTkNJTF9GQUlMLEdMX1NURU5DSUxfRlVOQyxHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCxHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyxHTF9TVEVOQ0lMX1JFRixHTF9TVEVOQ0lMX1ZBTFVFX01BU0ssR0xfU1RFTkNJTF9XUklURU1BU0ssR0xfU1VCUElYRUxfQklUUyxHTF9URVhUVVJFX0JJTkRJTkdfMkQsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NJWkUsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9UWVBFLEdMX1RFWFRVUkVfU1RBQ0tfREVQVEgsR0xfVU5QQUNLX0FMSUdOTUVOVCxHTF9WRVJURVhfQVJSQVlfQlVGRkVSX0JJTkRJTkcsR0xfVkVSVEVYX0FSUkFZX1NJWkUsR0xfVkVSVEVYX0FSUkFZX1NUUklERSxHTF9WRVJURVhfQVJSQVlfVFlQRSxHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTLEdMX1dFSUdIVF9BUlJBWV9TSVpFX09FUyxHTF9XRUlHSFRfQVJSQVlfU1RSSURFX09FUyxHTF9XRUlHSFRfQVJSQVlfVFlQRV9PRVMgaWZjaGVjayBwYXJhbXMgMiBwbmFtZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UsR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFLEdMX0RFUFRIX1JBTkdFLEdMX01BWF9WSUVXUE9SVF9ESU1TLEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFLEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQ09MT1JfQ0xFQVJfVkFMVUUsR0xfQ09MT1JfV1JJVEVNQVNLLEdMX1NDSVNTT1JfQk9YLEdMX1ZJRVdQT1JUIGlmY2hlY2sgcGFyYW1zIDE2IHBuYW1lIEdMX01PREVMVklFV19NQVRSSVgsR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMsR0xfUFJPSkVDVElPTl9NQVRSSVgsR0xfUFJPSkVDVElPTl9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTLEdMX1RFWFRVUkVfTUFUUklYLEdMX1RFWFRVUkVfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyBpZmNoZWNrIHBhcmFtcyBfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIHBuYW1lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTLEdMX0ZPR19DT0xPUixHTF9MSUdIVF9NT0RFTF9BTUJJRU5UDQorZ2xHZXRMaWdodCBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1NQT1RfRVhQT05FTlQsR0xfU1BPVF9DVVRPRkYsR0xfQ09OU1RBTlRfQVRURU5VQVRJT04sR0xfTElORUFSX0FUVEVOVUFUSU9OLEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiBpZmNoZWNrIHBhcmFtcyAzIHBuYW1lIEdMX1NQT1RfRElSRUNUSU9OIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQU1CSUVOVCxHTF9ESUZGVVNFLEdMX1NQRUNVTEFSLEdMX0VNSVNTSU9ODQorZ2xHZXRNYXRlcmlhbCBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1NISU5JTkVTUyBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0FNQklFTlQsR0xfRElGRlVTRSxHTF9TUEVDVUxBUixHTF9FTUlTU0lPTixHTF9BTUJJRU5UX0FORF9ESUZGVVNFDQorZ2xHZXRUZXhFbnYgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9URVhUVVJFX0VOVl9NT0RFLEdMX0NPTUJJTkVfUkdCLEdMX0NPTUJJTkVfQUxQSEEgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9URVhUVVJFX0VOVl9DT0xPUg0KK2dsR2V0VGV4UGFyYW1ldGVyIGNoZWNrIHBhcmFtcyAxDQorZ2xMaWdodE1vZGVsIGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfTElHSFRfTU9ERUxfVFdPX1NJREUgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UDQorZ2xMaWdodCBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1NQT1RfRVhQT05FTlQsR0xfU1BPVF9DVVRPRkYsR0xfQ09OU1RBTlRfQVRURU5VQVRJT04sR0xfTElORUFSX0FUVEVOVUFUSU9OLEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiBpZmNoZWNrIHBhcmFtcyAzIHBuYW1lIEdMX1NQT1RfRElSRUNUSU9OIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQU1CSUVOVCxHTF9ESUZGVVNFLEdMX1NQRUNVTEFSLEdMX0VNSVNTSU9ODQorZ2xMb2FkTWF0cml4IGNoZWNrIG0gMTYNCitnbE1hdGVyaWFsIGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfU0hJTklORVNTIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQU1CSUVOVCxHTF9ESUZGVVNFLEdMX1NQRUNVTEFSLEdMX0VNSVNTSU9OLEdMX0FNQklFTlRfQU5EX0RJRkZVU0UNCitnbE11bHRNYXRyaXggY2hlY2sgbSAxNg0KK2dsUG9pbnRQYXJhbWV0ZXIgY2hlY2sgcGFyYW1zIDENCitnbFRleEVudiBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1RFWFRVUkVfRU5WX01PREUsR0xfQ09NQklORV9SR0IsR0xfQ09NQklORV9BTFBIQSBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX1RFWFRVUkVfRU5WX0NPTE9SDQorZ2xUZXhJbWFnZTJEIG51bGxBbGxvd2VkDQorZ2xUZXhTdWJJbWFnZTJEIG51bGxBbGxvd2VkDQorZ2xCdWZmZXJEYXRhIG51bGxBbGxvd2VkDQorZ2xUZXhQYXJhbWV0ZXIgY2hlY2sgcGFyYW1zIDENCitnbFF1ZXJ5TWF0cml4eE9FUyBjaGVjayBtYW50aXNzYSAxNiBjaGVjayBleHBvbmVudCAxNiByZXR1cm4gLTENCitnbERyYXdUZXhmdk9FUyBjaGVjayBjb29yZHMgNQ0KK2dsRHJhd1RleGl2T0VTIGNoZWNrIGNvb3JkcyA1DQorZ2xEcmF3VGV4c3ZPRVMgY2hlY2sgY29vcmRzIDUNCitnbERyYXdUZXh4dk9FUyBjaGVjayBjb29yZHMgNQ0KK2dsQmluZEZyYW1lYnVmZmVyT0VTIHVuc3VwcG9ydGVkDQorZ2xCaW5kUmVuZGVyYnVmZmVyT0VTIHVuc3VwcG9ydGVkDQorZ2xCbGVuZEVxdWF0aW9uIHVuc3VwcG9ydGVkDQorZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUgdW5zdXBwb3J0ZWQNCitnbEJsZW5kRnVuY1NlcGFyYXRlIHVuc3VwcG9ydGVkDQorZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTIHVuc3VwcG9ydGVkIHJldHVybiAwDQorZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUyB1bnN1cHBvcnRlZA0KK2dsRGVsZXRlRnJhbWVidWZmZXJzT0VTIHVuc3VwcG9ydGVkDQorZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTIHVuc3VwcG9ydGVkDQorZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUyB1bnN1cHBvcnRlZA0KK2dsRnJhbWVidWZmZXJTdG9yYWdlT0VTIHVuc3VwcG9ydGVkDQorZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUyB1bnN1cHBvcnRlZA0KK2dsR2VuRnJhbWVidWZmZXJzT0VTIHVuc3VwcG9ydGVkDQorZ2xHZW5SZW5kZXJidWZmZXJzT0VTIHVuc3VwcG9ydGVkDQorZ2xHZW5lcmF0ZU1pcG1hcE9FUyB1bnN1cHBvcnRlZA0KK2dsR2V0QnVmZmVyUGFyYW1ldGVyIHVuc3VwcG9ydGVkDQorZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyB1bnN1cHBvcnRlZA0KK2dsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMgdW5zdXBwb3J0ZWQNCitnbEdldFRleEdlbiB1bnN1cHBvcnRlZA0KK2dsSXNGcmFtZWJ1ZmZlck9FUyB1bnN1cHBvcnRlZCByZXR1cm4gSk5JX0ZBTFNFDQorZ2xJc1JlbmRlcmJ1ZmZlck9FUyB1bnN1cHBvcnRlZCByZXR1cm4gSk5JX0ZBTFNFDQorZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVMgdW5zdXBwb3J0ZWQNCitnbE1hdHJpeEluZGV4UG9pbnRlck9FUyB1bnN1cHBvcnRlZA0KK2dsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUyB1bnN1cHBvcnRlZCByZXR1cm4gZmFsc2UNCitnbFRleEdlbiB1bnN1cHBvcnRlZA0KK2dsVGV4R2VuZiB1bnN1cHBvcnRlZA0KK2dsVGV4R2VuaSB1bnN1cHBvcnRlZA0KK2dsVGV4R2VueCB1bnN1cHBvcnRlZA0KK2dsV2VpZ2h0UG9pbnRlck9FUyB1bnN1cHBvcnRlZA0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ0Z1bmMuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ0Z1bmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzk0ZjQxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9DRnVuYy5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisNCitpbXBvcnQgamF2YS51dGlsLio7DQorDQorcHVibGljIGNsYXNzIENGdW5jIHsNCisNCisgICAgU3RyaW5nIG9yaWdpbmFsOw0KKw0KKyAgICBDVHlwZSBmdHlwZTsNCisgICAgU3RyaW5nIGZuYW1lOw0KKw0KKyAgICBMaXN0PFN0cmluZz4gYXJnTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCisgICAgTGlzdDxDVHlwZT4gYXJnVHlwZXMgPSBuZXcgQXJyYXlMaXN0PENUeXBlPigpOw0KKw0KKyAgICBib29sZWFuIGhhc1BvaW50ZXJBcmcgPSBmYWxzZTsNCisgICAgYm9vbGVhbiBoYXNUeXBlZFBvaW50ZXJBcmcgPSBmYWxzZTsNCisNCisgICAgcHVibGljIENGdW5jKFN0cmluZyBvcmlnaW5hbCkgew0KKyAgICAgICAgdGhpcy5vcmlnaW5hbCA9IG9yaWdpbmFsOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3JpZ2luYWwoKSB7DQorICAgICAgICByZXR1cm4gb3JpZ2luYWw7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgZm5hbWUpIHsNCisgICAgICAgIHRoaXMuZm5hbWUgPSBmbmFtZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQorICAgICAgICByZXR1cm4gZm5hbWU7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShDVHlwZSBmdHlwZSkgew0KKyAgICAgICAgdGhpcy5mdHlwZSA9IGZ0eXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDVHlwZSBnZXRUeXBlKCkgew0KKyAgICAgICAgcmV0dXJuIGZ0eXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGFkZEFyZ3VtZW50KFN0cmluZyBhcmdOYW1lLCBDVHlwZSBhcmdUeXBlKSB7DQorICAgICAgICBhcmdOYW1lcy5hZGQoYXJnTmFtZSk7DQorICAgICAgICBhcmdUeXBlcy5hZGQoYXJnVHlwZSk7DQorDQorICAgICAgICBpZiAoYXJnVHlwZS5pc1BvaW50ZXIoKSkgew0KKyAgICAgICAgICAgIGhhc1BvaW50ZXJBcmcgPSB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGFyZ1R5cGUuaXNUeXBlZFBvaW50ZXIoKSkgew0KKyAgICAgICAgICAgIGhhc1R5cGVkUG9pbnRlckFyZyA9IHRydWU7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXROdW1BcmdzKCkgew0KKyAgICAgICAgcmV0dXJuIGFyZ05hbWVzLnNpemUoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldEFyZ0luZGV4KFN0cmluZyBuYW1lKSB7DQorICAgICAgICBpbnQgbGVuID0gYXJnTmFtZXMuc2l6ZSgpOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhhcmdOYW1lcy5nZXQoaSkpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFyZ05hbWUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gYXJnTmFtZXMuZ2V0KGluZGV4KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ1R5cGUgZ2V0QXJnVHlwZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBhcmdUeXBlcy5nZXQoaW5kZXgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGhhc1BvaW50ZXJBcmcoKSB7DQorICAgICAgICByZXR1cm4gaGFzUG9pbnRlckFyZzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNUeXBlZFBvaW50ZXJBcmcoKSB7DQorICAgICAgICByZXR1cm4gaGFzVHlwZWRQb2ludGVyQXJnOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorICAgICAgICBTdHJpbmcgcyA9ICAiRnVuY3Rpb24gIiArIGZuYW1lICsgIiByZXR1cm5zICIgKyBmdHlwZSArICI6ICI7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ05hbWVzLnNpemUoKTsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKGkgPiAwKSB7DQorICAgICAgICAgICAgICAgIHMgKz0gIiwgIjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcyArPSBhcmdUeXBlcy5nZXQoaSkgKyAiICIgKyBhcmdOYW1lcy5nZXQoaSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIENGdW5jIHBhcnNlQ0Z1bmMoU3RyaW5nIHMpIHsNCisgICAgICAgIENGdW5jIGNmdW5jID0gbmV3IENGdW5jKHMpOw0KKyAgICAgICAgU3RyaW5nW10gdG9rZW5zID0gcy5zcGxpdCgiXFxzIik7DQorDQorICAgICAgICBpbnQgaSA9IDA7DQorICAgICAgICBDVHlwZSBmdHlwZSA9IG5ldyBDVHlwZSgpOw0KKyAgICAgICAgU3RyaW5nIGZ0eXBlTmFtZSA9IHRva2Vuc1tpKytdOw0KKyAgICAgICAgaWYgKGZ0eXBlTmFtZS5lcXVhbHMoImNvbnN0IikpIHsNCisgICAgICAgICAgICBmdHlwZS5zZXRJc0NvbnN0KHRydWUpOw0KKyAgICAgICAgICAgIGZ0eXBlTmFtZSA9IHRva2Vuc1tpKytdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZnR5cGUuc2V0QmFzZVR5cGUoZnR5cGVOYW1lKTsNCisNCisgICAgICAgIFN0cmluZyBmbmFtZSA9IHRva2Vuc1tpKytdOw0KKyAgICAgICAgaWYgKGZuYW1lLmVxdWFscygiKiIpKSB7DQorICAgICAgICAgICAgZnR5cGUuc2V0SXNQb2ludGVyKHRydWUpOw0KKyAgICAgICAgICAgIGZuYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICB9DQorCQ0KKyAgICAgICAgY2Z1bmMuc2V0TmFtZShmbmFtZSk7DQorICAgICAgICBjZnVuYy5zZXRUeXBlKGZ0eXBlKTsNCisJDQorICAgICAgICB3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsNCisgICAgICAgICAgICBTdHJpbmcgdG9rID0gdG9rZW5zW2krK107DQorCSAgICANCisgICAgICAgICAgICBpZiAodG9rLmVxdWFscygiKCIpKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAodG9rLmVxdWFscygiKSIpKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBDVHlwZSBhcmdUeXBlID0gbmV3IENUeXBlKCk7DQorCSAgICANCisgICAgICAgICAgICBTdHJpbmcgYXJnVHlwZU5hbWUgPSB0b2s7DQorICAgICAgICAgICAgU3RyaW5nIGFyZ05hbWUgPSAiIjsNCisJICAgIA0KKyAgICAgICAgICAgIGlmIChhcmdUeXBlTmFtZS5lcXVhbHMoImNvbnN0IikpIHsNCisgICAgICAgICAgICAgICAgYXJnVHlwZS5zZXRJc0NvbnN0KHRydWUpOw0KKyAgICAgICAgICAgICAgICBhcmdUeXBlTmFtZSA9IHRva2Vuc1tpKytdOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBhcmdUeXBlLnNldEJhc2VUeXBlKGFyZ1R5cGVOYW1lKTsNCisNCisgICAgICAgICAgICBpZiAoYXJnVHlwZU5hbWUuZXF1YWxzKCJ2b2lkIikpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKwkgICAgDQorICAgICAgICAgICAgYXJnTmFtZSA9IHRva2Vuc1tpKytdOw0KKyAgICAgICAgICAgIGlmIChhcmdOYW1lLnN0YXJ0c1dpdGgoIioiKSkgew0KKyAgICAgICAgICAgICAgICBhcmdUeXBlLnNldElzUG9pbnRlcih0cnVlKTsNCisgICAgICAgICAgICAgICAgYXJnTmFtZSA9IGFyZ05hbWUuc3Vic3RyaW5nKDEsIGFyZ05hbWUubGVuZ3RoKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoYXJnTmFtZS5lbmRzV2l0aCgiLCIpKSB7DQorICAgICAgICAgICAgICAgIGFyZ05hbWUgPSBhcmdOYW1lLnN1YnN0cmluZygwLCBhcmdOYW1lLmxlbmd0aCgpIC0gMSk7DQorICAgICAgICAgICAgfQ0KKwkgICAgDQorICAgICAgICAgICAgY2Z1bmMuYWRkQXJndW1lbnQoYXJnTmFtZSwgYXJnVHlwZSk7DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gY2Z1bmM7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9DVHlwZS5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9DVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMWVjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NUeXBlLmphdmEKQEAgLTAsMCArMSw4NSBAQAorDQorcHVibGljIGNsYXNzIENUeXBlIHsNCisNCisgICAgU3RyaW5nIGJhc2VUeXBlOw0KKyAgICBib29sZWFuIGlzQ29uc3Q7DQorICAgIGJvb2xlYW4gaXNQb2ludGVyOw0KKw0KKyAgICBwdWJsaWMgQ1R5cGUoKSB7DQorICAgIH0NCisNCisgICAgcHVibGljIENUeXBlKFN0cmluZyBiYXNlVHlwZSkgew0KKwlzZXRCYXNlVHlwZShiYXNlVHlwZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIENUeXBlKFN0cmluZyBiYXNlVHlwZSwgYm9vbGVhbiBpc0NvbnN0LCBib29sZWFuIGlzUG9pbnRlcikgew0KKwlzZXRCYXNlVHlwZShiYXNlVHlwZSk7DQorCXNldElzQ29uc3QoaXNDb25zdCk7DQorCXNldElzUG9pbnRlcihpc1BvaW50ZXIpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyYXRpb24oKSB7DQorCXJldHVybiBiYXNlVHlwZSArIChpc1BvaW50ZXIgPyAiICoiIDogIiIpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCBzZXRJc0NvbnN0KGJvb2xlYW4gaXNDb25zdCkgew0KKwl0aGlzLmlzQ29uc3QgPSBpc0NvbnN0Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzQ29uc3QoKSB7DQorCXJldHVybiBpc0NvbnN0Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldElzUG9pbnRlcihib29sZWFuIGlzUG9pbnRlcikgew0KKwl0aGlzLmlzUG9pbnRlciA9IGlzUG9pbnRlcjsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BvaW50ZXIoKSB7DQorCXJldHVybiBpc1BvaW50ZXI7DQorICAgIH0NCisNCisgICAgYm9vbGVhbiBpc1ZvaWQoKSB7DQorCVN0cmluZyBiYXNlVHlwZSA9IGdldEJhc2VUeXBlKCk7DQorCXJldHVybiBiYXNlVHlwZS5lcXVhbHMoIkdMdm9pZCIpIHx8DQorCSAgICBiYXNlVHlwZS5lcXVhbHMoInZvaWQiKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVkUG9pbnRlcigpIHsNCisJcmV0dXJuIGlzUG9pbnRlcigpICYmICFpc1ZvaWQoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlVHlwZShTdHJpbmcgYmFzZVR5cGUpIHsNCisJdGhpcy5iYXNlVHlwZSA9IGJhc2VUeXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVR5cGUoKSB7DQorCXJldHVybiBiYXNlVHlwZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwlTdHJpbmcgcyA9ICIiOw0KKwlpZiAoaXNDb25zdCgpKSB7DQorCSAgICBzICs9ICJjb25zdCAiOw0KKwl9DQorCXMgKz0gYmFzZVR5cGU7DQorCWlmIChpc1BvaW50ZXIoKSkgew0KKwkgICAgcyArPSAiKiI7DQorCX0NCisNCisJcmV0dXJuIHM7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCisJcmV0dXJuIGJhc2VUeXBlLmhhc2hDb2RlKCkgXiAoaXNQb2ludGVyID8gMiA6IDApIF4gKGlzQ29uc3QgPyAxIDogMCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7DQorCWlmIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIENUeXBlKSB7DQorCSAgICBDVHlwZSBjID0gKENUeXBlKW87DQorCSAgICByZXR1cm4gYmFzZVR5cGUuZXF1YWxzKGMuYmFzZVR5cGUpICYmDQorCQlpc1BvaW50ZXIoKSA9PSBjLmlzUG9pbnRlcigpICYmDQorCQlpc0NvbnN0KCkgPT0gYy5pc0NvbnN0KCk7DQorCX0NCisJcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ29kZUVtaXR0ZXIuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ29kZUVtaXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTliOTBhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9Db2RlRW1pdHRlci5qYXZhCkBAIC0wLDAgKzEsOCBAQAorDQorcHVibGljIGludGVyZmFjZSBDb2RlRW1pdHRlciB7DQorDQorICAgIHZvaWQgc2V0VmVyc2lvbihpbnQgdmVyc2lvbiwgYm9vbGVhbiBleHQsIGJvb2xlYW4gcGFjayk7DQorICAgIHZvaWQgZW1pdENvZGUoQ0Z1bmMgY2Z1bmMsIFN0cmluZyBvcmlnaW5hbCk7DQorICAgIHZvaWQgYWRkTmF0aXZlUmVnaXN0cmF0aW9uKFN0cmluZyBmbmFtZSk7DQorICAgIHZvaWQgZW1pdE5hdGl2ZVJlZ2lzdHJhdGlvbigpOw0KK30NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0dlbmVyYXRlR0wuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvR2VuZXJhdGVHTC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1N2VlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0dlbmVyYXRlR0wuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorDQoraW1wb3J0IGphdmEuaW8uKjsNCitpbXBvcnQgamF2YS51dGlsLio7DQorDQorcHVibGljIGNsYXNzIEdlbmVyYXRlR0wgew0KKw0KKyAgICBzdGF0aWMgdm9pZCBjb3B5KFN0cmluZyBmaWxlbmFtZSwgUHJpbnRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZW5hbWUpKTsNCisgICAgICAgIFN0cmluZyBzOw0KKyAgICAgICAgd2hpbGUgKChzID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIG91dC5wcmludGxuKHMpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW1pdChpbnQgdmVyc2lvbiwgYm9vbGVhbiBleHQsIGJvb2xlYW4gcGFjaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVFbWl0dGVyIGVtaXR0ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjUmVhZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gZ2xTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBnbEltcGxTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBjU3RyZWFtKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZyBzID0gbnVsbDsNCisgICAgICAgIGludCBjb3VudGVyID0gMDsNCisgICAgICAgIHdoaWxlICgocyA9IHNwZWNSZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGlmIChzLnRyaW0oKS5zdGFydHNXaXRoKCIvLyIpKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBDRnVuYyBjZnVuYyA9IENGdW5jLnBhcnNlQ0Z1bmMocyk7DQorDQorICAgICAgICAgICAgU3RyaW5nIGZuYW1lID0gY2Z1bmMuZ2V0TmFtZSgpOw0KKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCJzdHVicy8iICsgZm5hbWUgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuamF2YS0xIiArIHZlcnNpb24gKyAiLWlmIik7DQorICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsNCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTcGVjaWFsLWNhc2luZyBmdW5jdGlvbiAiICsgZm5hbWUpOw0KKyAgICAgICAgICAgICAgICBjb3B5KCJzdHVicy8iICsgZm5hbWUgKw0KKyAgICAgICAgICAgICAgICAgICAgICIuamF2YS0xIiArIHZlcnNpb24gKyAiLWlmIiwgZ2xTdHJlYW0pOw0KKyAgICAgICAgICAgICAgICBjb3B5KCJzdHVicy8iICsgZm5hbWUgKyAiLmphdmEtaW1wbCIsIGdsSW1wbFN0cmVhbSk7DQorICAgICAgICAgICAgICAgIGNvcHkoInN0dWJzLyIgKyBmbmFtZSArICIuY3BwIiwgY1N0cmVhbSk7DQorDQorICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIG5hdGl2ZSBmdW5jdGlvbiBuYW1lcw0KKyAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBpbXByb3ZlZCB0byByZXF1aXJlIGZld2VyIGRpc2NyZXRlIGZpbGVzDQorICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9ICJzdHVicy8iICsgZm5hbWUgKyAiLm5hdGl2ZVJlZyI7DQorICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0NCisgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlbmFtZSkpOw0KKyAgICAgICAgICAgICAgICBTdHJpbmcgbmZ1bmM7DQorICAgICAgICAgICAgICAgIHdoaWxlICgobmZ1bmMgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICBlbWl0dGVyLmFkZE5hdGl2ZVJlZ2lzdHJhdGlvbihuZnVuYyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBlbWl0dGVyLnNldFZlcnNpb24odmVyc2lvbiwgZXh0LCBwYWNrKTsNCisgICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0Q29kZShjZnVuYywgcyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgU3RyaW5nIGNsYXNzUGF0aE5hbWUgPSAiY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbCI7DQorICAgICAgICBib29sZWFuIHVzZUNvbnRleHRQb2ludGVyID0gdHJ1ZTsNCisNCisgICAgICAgIGludCBhaWR4ID0gMDsNCisgICAgICAgIHdoaWxlIChhcmdzW2FpZHhdLmNoYXJBdCgwKSA9PSAnLScpIHsNCisgICAgICAgICAgICBzd2l0Y2ggKGFyZ3NbYWlkeF0uY2hhckF0KDEpKSB7DQorICAgICAgICAgICAgY2FzZSAnYyc6DQorICAgICAgICAgICAgICAgIHVzZUNvbnRleHRQb2ludGVyID0gZmFsc2U7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVW5rbm93biBmbGFnOiAiICsgYXJnc1thaWR4XSk7DQorICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBhaWR4Kys7DQorICAgICAgICB9DQorDQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInVzZUNvbnRleHRQb2ludGVyID0gIiArIHVzZUNvbnRleHRQb2ludGVyKTsNCisNCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWMxMFJlYWRlciA9DQorICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOw0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3BlYzEwRXh0UmVhZGVyID0NCisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7DQorICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjMTFSZWFkZXIgPQ0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmdzW2FpZHgrK10pKTsNCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWMxMUV4dFJlYWRlciA9DQorICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOw0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3BlYzExRXh0UGFja1JlYWRlciA9DQorICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOw0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgY2hlY2tzUmVhZGVyID0NCisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7DQorDQorICAgICAgICBTdHJpbmcgZ2wxMEZpbGVuYW1lID0gImphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTAuamF2YSI7DQorICAgICAgICBTdHJpbmcgZ2wxMEV4dEZpbGVuYW1lID0NCisgICAgICAgICAgICAiamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMEV4dC5qYXZhIjsNCisgICAgICAgIFN0cmluZyBnbDExRmlsZW5hbWUgPSAiamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMS5qYXZhIjsNCisgICAgICAgIFN0cmluZyBnbDExRXh0RmlsZW5hbWUgPQ0KKyAgICAgICAgICAgICJqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0LmphdmEiOw0KKyAgICAgICAgU3RyaW5nIGdsMTFFeHRQYWNrRmlsZW5hbWUgPQ0KKyAgICAgICAgICAgICJqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0ZW5zaW9uUGFjay5qYXZhIjsNCisgICAgICAgIFN0cmluZyBnbEltcGxGaWxlbmFtZSA9ICJjb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsLmphdmEiOw0KKyAgICAgICAgU3RyaW5nIGNGaWxlbmFtZSA9ICJjb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfR0xJbXBsLmNwcCI7DQorDQorICAgICAgICBQcmludFN0cmVhbSBnbDEwU3RyZWFtID0NCisgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2wxMEZpbGVuYW1lKSk7DQorICAgICAgICBQcmludFN0cmVhbSBnbDEwRXh0U3RyZWFtID0NCisgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2wxMEV4dEZpbGVuYW1lKSk7DQorICAgICAgICBQcmludFN0cmVhbSBnbDExU3RyZWFtID0NCisgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2wxMUZpbGVuYW1lKSk7DQorICAgICAgICBQcmludFN0cmVhbSBnbDExRXh0U3RyZWFtID0NCisgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2wxMUV4dEZpbGVuYW1lKSk7DQorICAgICAgICBQcmludFN0cmVhbSBnbDExRXh0UGFja1N0cmVhbSA9DQorICAgICAgICAgICAgbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJvdXQvIiArIGdsMTFFeHRQYWNrRmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGdsSW1wbFN0cmVhbSA9DQorICAgICAgICAgICAgbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJvdXQvIiArIGdsSW1wbEZpbGVuYW1lKSk7DQorICAgICAgICBQcmludFN0cmVhbSBjU3RyZWFtID0NCisgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgY0ZpbGVuYW1lKSk7DQorDQorICAgICAgICBQYXJhbWV0ZXJDaGVja2VyIGNoZWNrZXIgPSBuZXcgUGFyYW1ldGVyQ2hlY2tlcihjaGVja3NSZWFkZXIpOw0KKw0KKyAgICAgICAgQ29kZUVtaXR0ZXIgZW1pdHRlciA9DQorICAgICAgICAgICAgbmV3IEpuaUNvZGVFbWl0dGVyKGNsYXNzUGF0aE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsMTBTdHJlYW0sIGdsMTBFeHRTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsMTFTdHJlYW0sIGdsMTFFeHRTdHJlYW0sIGdsMTFFeHRQYWNrU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbEltcGxTdHJlYW0sIGNTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUNvbnRleHRQb2ludGVyKTsNCisNCisgICAgICAgIGdsMTBTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKyBnbDEwRmlsZW5hbWUpOw0KKyAgICAgICAgZ2wxMEV4dFN0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArIGdsMTBFeHRGaWxlbmFtZSk7DQorICAgICAgICBnbDExU3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC8iICsgZ2wxMUZpbGVuYW1lKTsNCisgICAgICAgIGdsMTFFeHRTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKyBnbDExRXh0RmlsZW5hbWUpOw0KKyAgICAgICAgZ2wxMUV4dFBhY2tTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKw0KKyAgICAgICAgICAgIGdsMTFFeHRQYWNrRmlsZW5hbWUpOw0KKyAgICAgICAgZ2xJbXBsU3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC8iICsgZ2xJbXBsRmlsZW5hbWUpOw0KKyAgICAgICAgY1N0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9saWJzL2FuZHJvaWRfcnVudGltZS8iICsgY0ZpbGVuYW1lKTsNCisNCisgICAgICAgIGNvcHkoInN0dWJzL0dMMTBIZWFkZXIuamF2YS1pZiIsIGdsMTBTdHJlYW0pOw0KKyAgICAgICAgY29weSgic3R1YnMvR0wxMEV4dEhlYWRlci5qYXZhLWlmIiwgZ2wxMEV4dFN0cmVhbSk7DQorICAgICAgICBjb3B5KCJzdHVicy9HTDExSGVhZGVyLmphdmEtaWYiLCBnbDExU3RyZWFtKTsNCisgICAgICAgIGNvcHkoInN0dWJzL0dMMTFFeHRIZWFkZXIuamF2YS1pZiIsIGdsMTFFeHRTdHJlYW0pOw0KKyAgICAgICAgY29weSgic3R1YnMvR0wxMUV4dGVuc2lvblBhY2tIZWFkZXIuamF2YS1pZiIsIGdsMTFFeHRQYWNrU3RyZWFtKTsNCisgICAgICAgIGNvcHkoInN0dWJzL0dMSW1wbEhlYWRlci5qYXZhLWltcGwiLCBnbEltcGxTdHJlYW0pOw0KKyAgICAgICAgY29weSgic3R1YnMvR0xDSGVhZGVyLmNwcCIsIGNTdHJlYW0pOw0KKw0KKyAgICAgICAgZW1pdCgwLCBmYWxzZSwgZmFsc2UsDQorICAgICAgICAgICAgIGVtaXR0ZXIsIHNwZWMxMFJlYWRlciwgZ2wxMFN0cmVhbSwgZ2xJbXBsU3RyZWFtLCBjU3RyZWFtKTsNCisgICAgICAgIGVtaXQoMCwgdHJ1ZSwgZmFsc2UsDQorICAgICAgICAgICAgIGVtaXR0ZXIsIHNwZWMxMEV4dFJlYWRlciwgZ2wxMEV4dFN0cmVhbSwgZ2xJbXBsU3RyZWFtLCBjU3RyZWFtKTsNCisgICAgICAgIGVtaXQoMSwgZmFsc2UsIGZhbHNlLA0KKyAgICAgICAgICAgICBlbWl0dGVyLCBzcGVjMTFSZWFkZXIsIGdsMTFTdHJlYW0sIGdsSW1wbFN0cmVhbSwgY1N0cmVhbSk7DQorICAgICAgICBlbWl0KDEsIHRydWUsIGZhbHNlLA0KKyAgICAgICAgICAgICBlbWl0dGVyLCBzcGVjMTFFeHRSZWFkZXIsIGdsMTFFeHRTdHJlYW0sIGdsSW1wbFN0cmVhbSwgY1N0cmVhbSk7DQorICAgICAgICBlbWl0KDEsIHRydWUsIHRydWUsDQorICAgICAgICAgICAgIGVtaXR0ZXIsIHNwZWMxMUV4dFBhY2tSZWFkZXIsIGdsMTFFeHRQYWNrU3RyZWFtLCBnbEltcGxTdHJlYW0sDQorICAgICAgICAgICAgIGNTdHJlYW0pOw0KKw0KKyAgICAgICAgZW1pdHRlci5lbWl0TmF0aXZlUmVnaXN0cmF0aW9uKCk7DQorDQorICAgICAgICBnbDEwU3RyZWFtLnByaW50bG4oIn0iKTsNCisgICAgICAgIGdsMTBFeHRTdHJlYW0ucHJpbnRsbigifSIpOw0KKyAgICAgICAgZ2wxMVN0cmVhbS5wcmludGxuKCJ9Iik7DQorICAgICAgICBnbDExRXh0U3RyZWFtLnByaW50bG4oIn0iKTsNCisgICAgICAgIGdsMTFFeHRQYWNrU3RyZWFtLnByaW50bG4oIn0iKTsNCisgICAgICAgIGdsSW1wbFN0cmVhbS5wcmludGxuKCJ9Iik7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KRnVuYy5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KRnVuYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZDQ2NmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pGdW5jLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitwdWJsaWMgY2xhc3MgSkZ1bmMgew0KKw0KKyAgICBTdHJpbmcgY2xhc3NOYW1lID0gImNvbS5nb29nbGUuYW5kcm9pZC5nbGVzX2puaS5HTDExSW1wbCI7DQorDQorICAgIENGdW5jIGNmdW5jOw0KKyAgICBKVHlwZSBmdHlwZTsNCisgICAgU3RyaW5nIGZuYW1lOw0KKw0KKyAgICBMaXN0PFN0cmluZz4gYXJnTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCisgICAgTGlzdDxKVHlwZT4gYXJnVHlwZXMgPSBuZXcgQXJyYXlMaXN0PEpUeXBlPigpOw0KKyAgICBMaXN0PEludGVnZXI+IGFyZ0NJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOw0KKw0KKyAgICBib29sZWFuIGhhc0J1ZmZlckFyZyA9IGZhbHNlOw0KKyAgICBib29sZWFuIGhhc1R5cGVkQnVmZmVyQXJnID0gZmFsc2U7DQorICAgIEFycmF5TGlzdDxTdHJpbmc+IGJ1ZmZlckFyZ05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQorDQorICAgIHB1YmxpYyBKRnVuYyhDRnVuYyBjZnVuYykgew0KKyAgICAgICAgdGhpcy5jZnVuYyA9IGNmdW5jOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDRnVuYyBnZXRDRnVuYygpIHsNCisgICAgICAgIHJldHVybiBjZnVuYzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBmbmFtZSkgew0KKyAgICAgICAgdGhpcy5mbmFtZSA9IGZuYW1lOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisgICAgICAgIHJldHVybiBmbmFtZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKEpUeXBlIGZ0eXBlKSB7DQorICAgICAgICB0aGlzLmZ0eXBlID0gZnR5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIEpUeXBlIGdldFR5cGUoKSB7DQorICAgICAgICByZXR1cm4gZnR5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsNCisgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGJvb2xlYW4gaGFzQnVmZmVyQXJnKCkgew0KKyAgICAgICAgcmV0dXJuIGhhc0J1ZmZlckFyZzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNUeXBlZEJ1ZmZlckFyZygpIHsNCisgICAgICAgIHJldHVybiBoYXNUeXBlZEJ1ZmZlckFyZzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEJ1ZmZlckFyZ05hbWUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gYnVmZmVyQXJnTmFtZXMuZ2V0KGluZGV4KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBhZGRBcmd1bWVudChTdHJpbmcgYXJnTmFtZSwgSlR5cGUgYXJnVHlwZSwgaW50IGNpbmRleCkgew0KKyAgICAgICAgYXJnTmFtZXMuYWRkKGFyZ05hbWUpOw0KKyAgICAgICAgYXJnVHlwZXMuYWRkKGFyZ1R5cGUpOw0KKyAgICAgICAgYXJnQ0luZGljZXMuYWRkKG5ldyBJbnRlZ2VyKGNpbmRleCkpOw0KKw0KKyAgICAgICAgaWYgKGFyZ1R5cGUuaXNCdWZmZXIoKSkgew0KKyAgICAgICAgICAgIGhhc0J1ZmZlckFyZyA9IHRydWU7DQorICAgICAgICAgICAgYnVmZmVyQXJnTmFtZXMuYWRkKGFyZ05hbWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGFyZ1R5cGUuaXNUeXBlZEJ1ZmZlcigpKSB7DQorICAgICAgICAgICAgaGFzVHlwZWRCdWZmZXJBcmcgPSB0cnVlOw0KKyAgICAgICAgICAgIGJ1ZmZlckFyZ05hbWVzLmFkZChhcmdOYW1lKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE51bUFyZ3MoKSB7DQorICAgICAgICByZXR1cm4gYXJnTmFtZXMuc2l6ZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0QXJnSW5kZXgoU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIGludCBsZW4gPSBhcmdOYW1lcy5zaXplKCk7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGFyZ05hbWVzLmdldChpKSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJnTmFtZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBhcmdOYW1lcy5nZXQoaW5kZXgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBKVHlwZSBnZXRBcmdUeXBlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIGFyZ1R5cGVzLmdldChpbmRleCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXRBcmdDSW5kZXgoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gYXJnQ0luZGljZXMuZ2V0KGluZGV4KS5pbnRWYWx1ZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgSkZ1bmMgY29udmVydChDRnVuYyBjZnVuYywgYm9vbGVhbiB1c2VBcnJheSkgew0KKyAgICAgICAgSkZ1bmMgamZ1bmMgPSBuZXcgSkZ1bmMoY2Z1bmMpOw0KKyAgICAgICAgamZ1bmMuc2V0TmFtZShjZnVuYy5nZXROYW1lKCkpOw0KKyAgICAgICAgamZ1bmMuc2V0VHlwZShKVHlwZS5jb252ZXJ0KGNmdW5jLmdldFR5cGUoKSwgZmFsc2UpKTsNCisJDQorICAgICAgICBpbnQgbnVtQXJncyA9IGNmdW5jLmdldE51bUFyZ3MoKTsNCisgICAgICAgIGludCBudW1PZmZzZXRzID0gMDsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7DQorICAgICAgICAgICAgQ1R5cGUgY0FyZ1R5cGUgPSBjZnVuYy5nZXRBcmdUeXBlKGkpOw0KKyAgICAgICAgICAgIGlmIChjQXJnVHlwZS5pc1R5cGVkUG9pbnRlcigpICYmIHVzZUFycmF5KSB7DQorICAgICAgICAgICAgICAgICsrbnVtT2Zmc2V0czsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgew0KKyAgICAgICAgICAgIFN0cmluZyBjQXJnTmFtZSA9IGNmdW5jLmdldEFyZ05hbWUoaSk7DQorICAgICAgICAgICAgQ1R5cGUgY0FyZ1R5cGUgPSBjZnVuYy5nZXRBcmdUeXBlKGkpOw0KKw0KKyAgICAgICAgICAgIGpmdW5jLmFkZEFyZ3VtZW50KGNBcmdOYW1lLCBKVHlwZS5jb252ZXJ0KGNBcmdUeXBlLCB1c2VBcnJheSksIGkpOw0KKyAgICAgICAgICAgIGlmIChjQXJnVHlwZS5pc1R5cGVkUG9pbnRlcigpICYmIHVzZUFycmF5KSB7DQorICAgICAgICAgICAgICAgIGlmIChudW1PZmZzZXRzID4gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgamZ1bmMuYWRkQXJndW1lbnQoY0FyZ05hbWUgKyAiT2Zmc2V0IiwgbmV3IEpUeXBlKCJpbnQiKSwgaSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBqZnVuYy5hZGRBcmd1bWVudCgib2Zmc2V0IiwgbmV3IEpUeXBlKCJpbnQiKSwgaSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gamZ1bmM7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisgICAgICAgIFN0cmluZyBzID0gICJGdW5jdGlvbiAiICsgZm5hbWUgKyAiIHJldHVybnMgIiArIGZ0eXBlICsgIjogIjsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnTmFtZXMuc2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICBpZiAoaSA+IDApIHsNCisgICAgICAgICAgICAgICAgcyArPSAiLCAiOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzICs9IGFyZ1R5cGVzLmdldChpKSArICIgIiArIGFyZ05hbWVzLmdldChpKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBzOw0KKyAgICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvSlR5cGUuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvSlR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTZkNDQwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQorDQorcHVibGljIGNsYXNzIEpUeXBlIHsNCisgICAgDQorICAgIFN0cmluZyBiYXNlVHlwZTsNCisgICAgYm9vbGVhbiBpc0FycmF5Ow0KKyAgICBib29sZWFuIGlzQ2xhc3M7DQorDQorICAgIHN0YXRpYyBIYXNoTWFwPENUeXBlLEpUeXBlPiB0eXBlTWFwcGluZyA9IG5ldyBIYXNoTWFwPENUeXBlLEpUeXBlPigpOw0KKyAgICBzdGF0aWMgSGFzaE1hcDxDVHlwZSxKVHlwZT4gYXJyYXlUeXBlTWFwcGluZyA9IG5ldyBIYXNoTWFwPENUeXBlLEpUeXBlPigpOw0KKw0KKyAgICBzdGF0aWMgew0KKwkvLyBQcmltaXRpdmUgdHlwZXMNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xiaXRmaWVsZCIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xib29sZWFuIiksIG5ldyBKVHlwZSgiYm9vbGVhbiIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xjbGFtcGYiKSwgbmV3IEpUeXBlKCJmbG9hdCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xjbGFtcHgiKSwgbmV3IEpUeXBlKCJpbnQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZW51bSIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmbG9hdCIpLCBuZXcgSlR5cGUoImZsb2F0IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZpeGVkIiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludCIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xpbnRwdHIiKSwgbmV3IEpUeXBlKCJpbnQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMc2hvcnQiKSwgbmV3IEpUeXBlKCJzaG9ydCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaXplaSIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaXplaXB0ciIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1Ynl0ZSIpLCBuZXcgSlR5cGUoImJ5dGUiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWludCIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgidm9pZCIpLCBuZXcgSlR5cGUoInZvaWQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWJ5dGUiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJTdHJpbmciKSk7DQorDQorCS8vIFVudHlwZWQgcG9pbnRlcnMgbWFwIHRvIHVudHlwZWQgQnVmZmVycw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHZvaWQiLCB0cnVlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdm9pZCIsIGZhbHNlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoInZvaWQiLCBmYWxzZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5CdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKw0KKwkvLyBUeXBlZCBwb2ludGVycyBtYXAgdG8gdHlwZWQgQnVmZmVycw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGJvb2xlYW4iLCBmYWxzZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZpeGVkIiwgZmFsc2UsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmaXhlZCIsIHRydWUsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmbG9hdCIsIGZhbHNlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkZsb2F0QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmbG9hdCIsIHRydWUsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uRmxvYXRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludCIsIGZhbHNlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50IiwgdHJ1ZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVpbnQiLCBmYWxzZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVpbnQiLCB0cnVlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMc2hvcnQiLCB0cnVlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLlNob3J0QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisNCisJLy8gVHlwZWQgcG9pbnRlcnMgbWFwIHRvIGFycmF5cyArIG9mZnNldHMNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGJvb2xlYW4iLCBmYWxzZSwgdHJ1ZSksDQorCQkJICAgICBuZXcgSlR5cGUoImJvb2xlYW4iLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZml4ZWQiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZml4ZWQiLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZsb2F0IiwgZmFsc2UsIHRydWUpLCBuZXcgSlR5cGUoImZsb2F0IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZsb2F0IiwgdHJ1ZSwgdHJ1ZSksIG5ldyBKVHlwZSgiZmxvYXQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50IiwgZmFsc2UsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xpbnQiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMc2hvcnQiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJzaG9ydCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1aW50IiwgZmFsc2UsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1aW50IiwgdHJ1ZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludHB0ciIpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaXplaXB0ciIpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIEpUeXBlKCkgew0KKyAgICB9DQorDQorICAgIHB1YmxpYyBKVHlwZShTdHJpbmcgcHJpbWl0aXZlVHlwZU5hbWUpIHsNCisJdGhpcy5iYXNlVHlwZSA9IHByaW1pdGl2ZVR5cGVOYW1lOw0KKwl0aGlzLmlzQ2xhc3MgPSBmYWxzZTsNCisJdGhpcy5pc0FycmF5ID0gZmFsc2U7DQorICAgIH0NCisNCisgICAgcHVibGljIEpUeXBlKFN0cmluZyBwcmltaXRpdmVUeXBlTmFtZSwgYm9vbGVhbiBpc0NsYXNzLCBib29sZWFuIGlzQXJyYXkpIHsNCisJdGhpcy5iYXNlVHlwZSA9IHByaW1pdGl2ZVR5cGVOYW1lOw0KKwl0aGlzLmlzQ2xhc3MgPSBpc0NsYXNzOw0KKwl0aGlzLmlzQXJyYXkgPSBpc0FycmF5Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVR5cGUoKSB7DQorCXJldHVybiBiYXNlVHlwZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwlyZXR1cm4gYmFzZVR5cGUgKyAoaXNBcnJheSA/ICJbXSIgOiAiIik7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsNCisJcmV0dXJuIGlzQXJyYXk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNDbGFzcygpIHsNCisJcmV0dXJuIGlzQ2xhc3M7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7DQorCXJldHVybiAhaXNDbGFzcygpICYmICFpc0FycmF5KCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNWb2lkKCkgew0KKwlyZXR1cm4gYmFzZVR5cGUuZXF1YWxzKCJ2b2lkIik7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNCdWZmZXIoKSB7DQorCXJldHVybiBiYXNlVHlwZS5pbmRleE9mKCJCdWZmZXIiKSAhPSAtMTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVkQnVmZmVyKCkgew0KKwlyZXR1cm4gIWJhc2VUeXBlLmVxdWFscygiamF2YS5uaW8uQnVmZmVyIikgJiYNCisJICAgIChiYXNlVHlwZS5pbmRleE9mKCJCdWZmZXIiKSAhPSAtMSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHN0YXRpYyBKVHlwZSBjb252ZXJ0KENUeXBlIGN0eXBlLCBib29sZWFuIHVzZUFycmF5KSB7DQorIAlKVHlwZSBqYXZhVHlwZSA9IG51bGw7DQorIAlpZiAodXNlQXJyYXkpIHsNCisgCSAgICBqYXZhVHlwZSA9IGFycmF5VHlwZU1hcHBpbmcuZ2V0KGN0eXBlKTsNCisgCX0NCisgCWlmIChqYXZhVHlwZSA9PSBudWxsKSB7DQorIAkgICAgamF2YVR5cGUgPSB0eXBlTWFwcGluZy5nZXQoY3R5cGUpOw0KKyAJfQ0KKyAJaWYgKGphdmFUeXBlID09IG51bGwpIHsNCisgCSAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgQyB0eXBlOiAiICsgY3R5cGUpOw0KKyAJfQ0KKyAJcmV0dXJuIGphdmFUeXBlOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvSm5pQ29kZUVtaXR0ZXIuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvSm5pQ29kZUVtaXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I5YTNlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KbmlDb2RlRW1pdHRlci5qYXZhCkBAIC0wLDAgKzEsMTA4NiBAQAoraW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEVtaXRzIGEgSmF2YSBpbnRlcmZhY2UgYW5kIEphdmEgJiBDIGltcGxlbWVudGF0aW9uIGZvciBhIEMgZnVuY3Rpb24uCisgKgorICogPHA+IFRoZSBKYXZhIGludGVyZmFjZSB3aWxsIGhhdmUgQnVmZmVyIGFuZCBhcnJheSB2YXJpYW50cyBmb3IgZnVuY3Rpb25zIHRoYXQKKyAqIGhhdmUgYSB0eXBlZCBwb2ludGVyIGFyZ3VtZW50LiAgVGhlIGFycmF5IHZhcmlhbnQgd2lsbCBjb252ZXJ0IGEgc2luZ2xlICI8dHlwZT4gKmRhdGEiCisgKiBhcmd1bWVudCB0byBhIHBhaXIgb2YgYXJndW1lbnRzICI8dHlwZT5bXSBkYXRhLCBpbnQgb2Zmc2V0Ii4KKyAqLworcHVibGljIGNsYXNzIEpuaUNvZGVFbWl0dGVyIGltcGxlbWVudHMgQ29kZUVtaXR0ZXIgeworCisgICAgLy8gSWYgdHJ1ZSwgdXNlIEMrKyBzdHlsZSBmb3IgY2FsbGluZyB0aHJvdWdoIGEgSk5JRW52ICo6CisgICAgLy8gZW52LT5GdW5jKC4uLikKKyAgICAvLyBJZiBmYWxzZSwgdXNlIEMgc3R5bGU6CisgICAgLy8gKCplbnYpLT5GdW5jKGVudiwgLi4uKQorICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIG1Vc2VDUGx1c1BsdXMgPSB0cnVlOworCisgICAgYm9vbGVhbiBtVXNlQ29udGV4dFBvaW50ZXIgPSB0cnVlOworCisgICAgU3RyaW5nIG1DbGFzc1BhdGhOYW1lOworICAgIAorICAgIFBhcmFtZXRlckNoZWNrZXIgbUNoZWNrZXI7CisgICAgUHJpbnRTdHJlYW0gbUphdmExMEludGVyZmFjZVN0cmVhbTsKKyAgICBQcmludFN0cmVhbSBtSmF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtOworICAgIFByaW50U3RyZWFtIG1KYXZhMTFJbnRlcmZhY2VTdHJlYW07CisgICAgUHJpbnRTdHJlYW0gbUphdmExMUV4dEludGVyZmFjZVN0cmVhbTsKKyAgICBQcmludFN0cmVhbSBtSmF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbTsKKyAgICBQcmludFN0cmVhbSBtSmF2YUltcGxTdHJlYW07CisgICAgUHJpbnRTdHJlYW0gbUNTdHJlYW07CisKKyAgICBQcmludFN0cmVhbSBtSmF2YUludGVyZmFjZVN0cmVhbTsKKworICAgIExpc3Q8U3RyaW5nPiBuYXRpdmVSZWdpc3RyYXRpb25zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKyAgICBib29sZWFuIG5lZWRzRXhpdDsKKworICAgIHN0YXRpYyBTdHJpbmcgaW5kZW50ID0gIiAgICAiOworCisgICAgSGFzaFNldDxTdHJpbmc+IG1GdW5jdGlvbnNFbWl0dGVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCisgICAgLyoqCisgICAgICogQHBhcmFtIGphdmExMEludGVyZmFjZVN0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgSmF2YSBpbnRlcmZhY2UgZm9yIEdMIDEuMCBmdW5jdGlvbnMKKyAgICAgKiBAcGFyYW0gamF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGludGVyZmFjZSBmb3IgR0wgMS4wIGV4dGVuc2lvbiBmdW5jdGlvbnMKKyAgICAgKiBAcGFyYW0gamF2YTExSW50ZXJmYWNlU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGludGVyZmFjZSBmb3IgR0wgMS4xIGZ1bmN0aW9ucyAKKyAgICAgKiBAcGFyYW0gamF2YTExRXh0SW50ZXJmYWNlU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGludGVyZmFjZSBmb3IgR0wgMS4xIEV4dGVuc2lvbiBmdW5jdGlvbnMKKyAgICAgKiBAcGFyYW0gamF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgSmF2YSBpbnRlcmZhY2UgZm9yIEdMIDEuMSBFeHRlbnNpb24gUGFjayBmdW5jdGlvbnMKKyAgICAgKiBAcGFyYW0gamF2YUltcGxTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEphdmEgaW1wbGVtZW50YXRpb24KKyAgICAgKiBAcGFyYW0gY1N0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgQyBpbXBsZW1lbnRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBKbmlDb2RlRW1pdHRlcihTdHJpbmcgY2xhc3NQYXRoTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyQ2hlY2tlciBjaGVja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBqYXZhMTBJbnRlcmZhY2VTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmExMEV4dEludGVyZmFjZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YTExSW50ZXJmYWNlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBqYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmExMUV4dFBhY2tJbnRlcmZhY2VTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmFJbXBsU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBjU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZUNvbnRleHRQb2ludGVyKSB7CisgICAgICAgIG1DbGFzc1BhdGhOYW1lID0gY2xhc3NQYXRoTmFtZTsKKyAgICAgICAgbUNoZWNrZXIgPSBjaGVja2VyOworICAgICAgICBtSmF2YTEwSW50ZXJmYWNlU3RyZWFtID0gamF2YTEwSW50ZXJmYWNlU3RyZWFtOworICAgICAgICBtSmF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtID0gamF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtOworICAgICAgICBtSmF2YTExSW50ZXJmYWNlU3RyZWFtID0gamF2YTExSW50ZXJmYWNlU3RyZWFtOworICAgICAgICBtSmF2YTExRXh0SW50ZXJmYWNlU3RyZWFtID0gamF2YTExRXh0SW50ZXJmYWNlU3RyZWFtOworICAgICAgICBtSmF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbSA9IGphdmExMUV4dFBhY2tJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIG1KYXZhSW1wbFN0cmVhbSA9IGphdmFJbXBsU3RyZWFtOworICAgICAgICBtQ1N0cmVhbSA9IGNTdHJlYW07CisgICAgICAgIG1Vc2VDb250ZXh0UG9pbnRlciA9IHVzZUNvbnRleHRQb2ludGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oaW50IHZlcnNpb24sIGJvb2xlYW4gZXh0LCBib29sZWFuIHBhY2spIHsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgbUphdmFJbnRlcmZhY2VTdHJlYW0gPSBleHQgPyBtSmF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtIDoKKyAgICAgICAgICAgICAgICBtSmF2YTEwSW50ZXJmYWNlU3RyZWFtOworICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgbUphdmFJbnRlcmZhY2VTdHJlYW0gPSBleHQgPworICAgICAgICAgICAgICAgIChwYWNrID8gbUphdmExMUV4dFBhY2tJbnRlcmZhY2VTdHJlYW0gOgorICAgICAgICAgICAgICAgICBtSmF2YTExRXh0SW50ZXJmYWNlU3RyZWFtKSA6CisgICAgICAgICAgICAgICAgbUphdmExMUludGVyZmFjZVN0cmVhbTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJCYWQgdmVyc2lvbjogIiArIHZlcnNpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW1pdENvZGUoQ0Z1bmMgY2Z1bmMsIFN0cmluZyBvcmlnaW5hbCkgeworICAgICAgICBKRnVuYyBqZnVuYzsKKyAgICAgICAgU3RyaW5nIHNpZ25hdHVyZTsKKyAgICAgICAgYm9vbGVhbiBkdXBsaWNhdGU7CisgICAgICAgIAorICAgICAgICBpZiAoY2Z1bmMuaGFzVHlwZWRQb2ludGVyQXJnKCkpIHsKKyAgICAgICAgICAgIGpmdW5jID0gSkZ1bmMuY29udmVydChjZnVuYywgdHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIERvbid0IGVtaXQgZHVwbGljYXRlIGZ1bmN0aW9ucworICAgICAgICAgICAgLy8gVGhlc2UgbWF5IGFwcGVhciBiZWNhdXNlIHRoZXkgYXJlIGRlZmluZWQgaW4gbXVsdGlwbGUKKyAgICAgICAgICAgIC8vIEphdmEgaW50ZXJmYWNlcyAoZS5nLiwgR0wxMS9HTDExRXh0ZW5zaW9uUGFjaykKKyAgICAgICAgICAgIHNpZ25hdHVyZSA9IGpmdW5jLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBkdXBsaWNhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtRnVuY3Rpb25zRW1pdHRlZC5jb250YWlucyhzaWduYXR1cmUpKSB7CisgICAgICAgICAgICAgICAgZHVwbGljYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUZ1bmN0aW9uc0VtaXR0ZWQuYWRkKHNpZ25hdHVyZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZHVwbGljYXRlKSB7CisgICAgICAgICAgICAgICAgZW1pdE5hdGl2ZURlY2xhcmF0aW9uKGpmdW5jLCBtSmF2YUltcGxTdHJlYW0pOworICAgICAgICAgICAgICAgIGVtaXRKYXZhQ29kZShqZnVuYywgbUphdmFJbXBsU3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVtaXRKYXZhSW50ZXJmYWNlQ29kZShqZnVuYywgbUphdmFJbnRlcmZhY2VTdHJlYW0pOworICAgICAgICAgICAgaWYgKCFkdXBsaWNhdGUpIHsKKyAgICAgICAgICAgICAgICBlbWl0Sm5pQ29kZShqZnVuYywgbUNTdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgamZ1bmMgPSBKRnVuYy5jb252ZXJ0KGNmdW5jLCBmYWxzZSk7CisKKyAgICAgICAgc2lnbmF0dXJlID0gamZ1bmMudG9TdHJpbmcoKTsKKyAgICAgICAgZHVwbGljYXRlID0gZmFsc2U7CisgICAgICAgIGlmIChtRnVuY3Rpb25zRW1pdHRlZC5jb250YWlucyhzaWduYXR1cmUpKSB7CisgICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUZ1bmN0aW9uc0VtaXR0ZWQuYWRkKHNpZ25hdHVyZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWR1cGxpY2F0ZSkgeworICAgICAgICAgICAgZW1pdE5hdGl2ZURlY2xhcmF0aW9uKGpmdW5jLCBtSmF2YUltcGxTdHJlYW0pOworICAgICAgICB9CisgICAgICAgIGVtaXRKYXZhSW50ZXJmYWNlQ29kZShqZnVuYywgbUphdmFJbnRlcmZhY2VTdHJlYW0pOworICAgICAgICBpZiAoIWR1cGxpY2F0ZSkgeworICAgICAgICAgICAgZW1pdEphdmFDb2RlKGpmdW5jLCBtSmF2YUltcGxTdHJlYW0pOworICAgICAgICAgICAgZW1pdEpuaUNvZGUoamZ1bmMsIG1DU3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVtaXROYXRpdmVEZWNsYXJhdGlvbihKRnVuYyBqZnVuYywgUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIG91dC5wcmludGxuKCIgICAgLy8gQyBmdW5jdGlvbiAiICsgamZ1bmMuZ2V0Q0Z1bmMoKS5nZXRPcmlnaW5hbCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oKTsKKworICAgICAgICBlbWl0RnVuY3Rpb24oamZ1bmMsIG91dCwgdHJ1ZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVtaXRKYXZhSW50ZXJmYWNlQ29kZShKRnVuYyBqZnVuYywgUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIGVtaXRGdW5jdGlvbihqZnVuYywgb3V0LCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW1pdEphdmFDb2RlKEpGdW5jIGpmdW5jLCBQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgZW1pdEZ1bmN0aW9uKGpmdW5jLCBvdXQsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHZvaWQgZW1pdEZ1bmN0aW9uQ2FsbChKRnVuYyBqZnVuYywgUHJpbnRTdHJlYW0gb3V0LCBTdHJpbmcgaWlpLCBib29sZWFuIGdyYWJBcnJheSApIHsKKyAgICAgICAgYm9vbGVhbiBpc1ZvaWQgPSBqZnVuYy5nZXRUeXBlKCkuaXNWb2lkKCk7CisgICAgICAgIGJvb2xlYW4gaXNQb2ludGVyRnVuYyA9IGpmdW5jLmdldE5hbWUoKS5lbmRzV2l0aCgiUG9pbnRlciIpICYmCisgICAgICAgICAgICBqZnVuYy5nZXRDRnVuYygpLmhhc1BvaW50ZXJBcmcoKTsKKworICAgICAgICBpZiAoIWlzVm9pZCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldFR5cGUoKSArICIgX3JldHVyblZhbHVlOyIpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludGxuKGlpaSArCisgICAgICAgICAgICAgICAgICAgIChpc1ZvaWQgPyAiIiA6ICJfcmV0dXJuVmFsdWUgPSAiKSArCisgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgIChpc1BvaW50ZXJGdW5jID8gIkJvdW5kcyIgOiAiIiApICsKKyAgICAgICAgICAgICAgICAgICAgIigiKTsKKwkKKyAgICAgICAgaW50IG51bUFyZ3MgPSBqZnVuYy5nZXROdW1BcmdzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgYXJnTmFtZSA9IGpmdW5jLmdldEFyZ05hbWUoaSk7CisgICAgICAgICAgICBKVHlwZSBhcmdUeXBlID0gamZ1bmMuZ2V0QXJnVHlwZShpKTsKKworICAgICAgICAgICAgaWYgKGdyYWJBcnJheSAmJiBhcmdUeXBlLmlzVHlwZWRCdWZmZXIoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IGFyZ1R5cGUuZ2V0QmFzZVR5cGUoKTsKKyAgICAgICAgICAgICAgICB0eXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZyg5LCB0eXBlTmFtZS5sZW5ndGgoKSAtIDYpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJnZXQiICsgdHlwZU5hbWUgKyAiQXJyYXkoIiArIGFyZ05hbWUgKyAiKSwiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoaWlpICsgaW5kZW50ICsgImdldE9mZnNldCgiICsgYXJnTmFtZSArICIpIik7IAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoaWlpICsgaW5kZW50ICsgYXJnTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA9PSBudW1BcmdzIC0gMSkgeworICAgICAgICAgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIsIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArIGFyZ05hbWUgKyAiLnJlbWFpbmluZygpIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIsIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkKKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIik7Iik7CisgICAgfQorCisgICAgdm9pZCBwcmludElmY2hlY2tQb3N0YW1ibGUoUHJpbnRTdHJlYW0gb3V0LCBib29sZWFuIGlzQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZW1pdEV4Y2VwdGlvbkNoZWNrLCBTdHJpbmcgaWlpKSB7CisgICAgICAgIHByaW50SWZjaGVja1Bvc3RhbWJsZShvdXQsIGlzQnVmZmVyLCBlbWl0RXhjZXB0aW9uQ2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0IiwgIl9yZW1haW5pbmciLCBpaWkpOworICAgIH0KKworICAgIHZvaWQgcHJpbnRJZmNoZWNrUG9zdGFtYmxlKFByaW50U3RyZWFtIG91dCwgYm9vbGVhbiBpc0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGVtaXRFeGNlcHRpb25DaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb2Zmc2V0LCBTdHJpbmcgcmVtYWluaW5nLCBTdHJpbmcgaWlpKSB7CisgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgZGVmYXVsdDoiKTsKKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgICAgX25lZWRlZCA9IDA7Iik7CisgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICAgIGJyZWFrOyIpOworICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOworCisgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoIiArIHJlbWFpbmluZyArICIgPCBfbmVlZGVkKSB7Iik7CisgICAgICAgIGlmIChlbWl0RXhjZXB0aW9uQ2hlY2spIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfZXhjZXB0aW9uID0gMTsiKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICJfZW52IiA6ICIoKl9lbnYpIikgKworICAgICAgICAgICAgICAgICAgICAiLT5UaHJvd05ldygiICsKKyAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiIiA6ICJfZW52LCAiKSArCisgICAgICAgICAgICAgICAgICAgICJJQUVDbGFzcywgIiArCisgICAgICAgICAgICAgICAgICAgICJcIiIgKworICAgICAgICAgICAgICAgICAgICAoaXNCdWZmZXIgPyAKKyAgICAgICAgICAgICAgICAgICAgICJyZW1haW5pbmcoKSIgOiAibGVuZ3RoIC0gIiArIG9mZnNldCkgKworICAgICAgICAgICAgICAgICAgICAiIDwgbmVlZGVkXCIpOyIpOworICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiZ290byBleGl0OyIpOworICAgICAgICBuZWVkc0V4aXQgPSB0cnVlOworICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOworICAgIH0KKworICAgIGJvb2xlYW4gaXNOdWxsQWxsb3dlZChDRnVuYyBjZnVuYykgeworICAgICAgICBTdHJpbmdbXSBjaGVja3MgPSBtQ2hlY2tlci5nZXRDaGVja3MoY2Z1bmMuZ2V0TmFtZSgpKTsKKyAgICAgICAgaW50IGluZGV4ID0gMTsKKyAgICAgICAgaWYgKGNoZWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBjaGVja3MubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJyZXR1cm4iKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5zdGFydHNXaXRoKCJjaGVjayIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDM7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygiaWZjaGVjayIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygidW5zdXBwb3J0ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoIm51bGxBbGxvd2VkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogdW5rbm93biBrZXl3b3JkIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NbaW5kZXhdICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU3RyaW5nIGdldEVycm9yUmV0dXJuVmFsdWUoQ0Z1bmMgY2Z1bmMpIHsKKyAgICAgICAgQ1R5cGUgcmV0dXJuVHlwZSA9IGNmdW5jLmdldFR5cGUoKTsKKyAgICAgICAgYm9vbGVhbiBpc1ZvaWQgPSByZXR1cm5UeXBlLmlzVm9pZCgpOworICAgICAgICBpZiAoaXNWb2lkKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ1tdIGNoZWNrcyA9IG1DaGVja2VyLmdldENoZWNrcyhjZnVuYy5nZXROYW1lKCkpOworCisgICAgICAgIGludCBpbmRleCA9IDE7CisgICAgICAgIGlmIChjaGVja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgY2hlY2tzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygicmV0dXJuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrc1tpbmRleCArIDFdOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5zdGFydHNXaXRoKCJjaGVjayIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDM7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygiaWZjaGVjayIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygidW5zdXBwb3J0ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoIm51bGxBbGxvd2VkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiB1bmtub3duIGtleXdvcmQgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleF0gKyAiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1Vuc3VwcG9ydGVkRnVuYyhDRnVuYyBjZnVuYykgeworICAgICAgICBTdHJpbmdbXSBjaGVja3MgPSBtQ2hlY2tlci5nZXRDaGVja3MoY2Z1bmMuZ2V0TmFtZSgpKTsKKyAgICAgICAgaW50IGluZGV4ID0gMTsKKyAgICAgICAgaWYgKGNoZWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBjaGVja3MubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJ1bnN1cHBvcnRlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInJldHVybiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLnN0YXJ0c1dpdGgoImNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJpZmNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gNTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJudWxsQWxsb3dlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogdW5rbm93biBrZXl3b3JkIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NbaW5kZXhdICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBlbWl0TmF0aXZlQm91bmRzQ2hlY2tzKENGdW5jIGNmdW5jLCBTdHJpbmcgY25hbWUsIFByaW50U3RyZWFtIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0J1ZmZlciwgYm9vbGVhbiBlbWl0RXhjZXB0aW9uQ2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvZmZzZXQsIFN0cmluZyByZW1haW5pbmcsIFN0cmluZyBpaWkpIHsKKyAgICAgICAgQ1R5cGUgcmV0dXJuVHlwZSA9IGNmdW5jLmdldFR5cGUoKTsKKyAgICAgICAgYm9vbGVhbiBpc1ZvaWQgPSByZXR1cm5UeXBlLmlzVm9pZCgpOworCisgICAgICAgIFN0cmluZ1tdIGNoZWNrcyA9IG1DaGVja2VyLmdldENoZWNrcyhjZnVuYy5nZXROYW1lKCkpOworICAgICAgICBTdHJpbmcgY2hlY2tWYXI7CisgICAgICAgIFN0cmluZyByZXR2YWwgPSBnZXRFcnJvclJldHVyblZhbHVlKGNmdW5jKTsKKworICAgICAgICBib29sZWFuIGxhc3RXYXNJZmNoZWNrID0gZmFsc2U7CisKKyAgICAgICAgaW50IGluZGV4ID0gMTsKKyAgICAgICAgaWYgKGNoZWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIHJlbWFpbmluZ0RlY2xhcmVkID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIG51bGxDaGVja0RlY2xhcmVkID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIG9mZnNldENoZWNrZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGNoZWNrcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tzW2luZGV4XS5zdGFydHNXaXRoKCJjaGVjayIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0V2FzSWZjaGVjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRJZmNoZWNrUG9zdGFtYmxlKG91dCwgaXNCdWZmZXIsIGVtaXRFeGNlcHRpb25DaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHJlbWFpbmluZywgaWlpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsYXN0V2FzSWZjaGVjayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAoY25hbWUgIT0gbnVsbCAmJiAhY25hbWUuZXF1YWxzKGNoZWNrc1tpbmRleCArIDFdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoIiArIHJlbWFpbmluZyArICIgPCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzW2luZGV4ICsgMl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbWl0RXhjZXB0aW9uQ2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfZXhjZXB0aW9uID0gMTsiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkgICAgU3RyaW5nIGV4Y2VwdGlvbkNsYXNzTmFtZSA9ICJJQUVDbGFzcyI7CisJCSAgICAvLyBJZiB0aGUgImNoZWNrIiBrZXl3b3JkIHdhcyBvZiB0aGUgZm9ybQorCQkgICAgLy8gImNoZWNrXzxjbGFzcyBuYW1lPiIsIHVzZSB0aGUgY2xhc3MgbmFtZSBpbiB0aGUKKwkJICAgIC8vIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24KKwkJICAgIGludCB1bmRlcnNjb3JlID0gY2hlY2tzW2luZGV4XS5pbmRleE9mKCdfJyk7CisJCSAgICBpZiAodW5kZXJzY29yZSA+PSAwKSB7CisJCQlleGNlcHRpb25DbGFzc05hbWUgPSBjaGVja3NbaW5kZXhdLnN1YnN0cmluZyh1bmRlcnNjb3JlICsgMSkgKyAiQ2xhc3MiOworCQkgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICJfZW52IiA6ICIoKl9lbnYpIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5UaHJvd05ldygiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiIiA6ICJfZW52LCAiKSArCisJCQkJZXhjZXB0aW9uQ2xhc3NOYW1lICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNCdWZmZXIgPyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1haW5pbmcoKSIgOiAibGVuZ3RoIC0gIiArIG9mZnNldCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIDwgIiArIGNoZWNrc1tpbmRleCArIDJdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiKTsiKTsKKworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiZ290byBleGl0OyIpOworICAgICAgICAgICAgICAgICAgICBuZWVkc0V4aXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAzOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoImlmY2hlY2siKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBtYXRjaGVzID0gY2hlY2tzW2luZGV4ICsgNF0uc3BsaXQoIiwiKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3RXYXNJZmNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiaW50IF9uZWVkZWQ7Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN3aXRjaCAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NbaW5kZXggKyAzXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF0Y2hlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiNpZiBkZWZpbmVkKCIgKyBtYXRjaGVzW2ldICsgIikiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGNhc2UgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiI2VuZGlmIC8vIGRlZmluZWQoIiArIG1hdGNoZXNbaV0gKyAiKSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIF9uZWVkZWQgPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzW2luZGV4ICsgMl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBicmVhazsiKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgbGFzdFdhc0lmY2hlY2sgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSA1OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInJldHVybiIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInVuc3VwcG9ydGVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygibnVsbEFsbG93ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiB1bmtub3duIGtleXdvcmQgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleF0gKyAiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGxhc3RXYXNJZmNoZWNrKSB7CisgICAgICAgICAgICBwcmludElmY2hlY2tQb3N0YW1ibGUob3V0LCBpc0J1ZmZlciwgZW1pdEV4Y2VwdGlvbkNoZWNrLCBpaWkpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbGVhbiBoYXNOb25Db25zdEFyZyhKRnVuYyBqZnVuYywgQ0Z1bmMgY2Z1bmMsCisgICAgICAgIExpc3Q8SW50ZWdlcj4gbm9uUHJpbWl0aXZlQXJncykgeworICAgICAgICBpZiAobm9uUHJpbWl0aXZlQXJncy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbm9uUHJpbWl0aXZlQXJncy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBub25QcmltaXRpdmVBcmdzLmdldChpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KTsKKyAgICAgICAgICAgICAgICBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpZHgpLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWNmdW5jLmdldEFyZ1R5cGUoY0luZGV4KS5pc0NvbnN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNCdWZmZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWNmdW5jLmdldEFyZ1R5cGUoY0luZGV4KS5pc0NvbnN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBFbWl0IGEgZnVuY3Rpb24gaW4gc2V2ZXJhbCB2YXJpYW50czoKKyAgICAgKgorICAgICAqIGlmIG5hdGl2ZURlY2w6IHB1YmxpYyBuYXRpdmUgPHJldHVybnR5cGU+IGZ1bmMoYXJncyk7CisgICAgICoKKyAgICAgKiBpZiAhbmF0aXZlRGVjbDoKKyAgICAgKiAgIGlmIGludGVyZmFjZURlY2w6ICBwdWJsaWMgPHJldHVybnR5cGU+IGZ1bmMoYXJncyk7CisgICAgICogICBpZiAhaW50ZXJmYWNlRGVjbDogcHVibGljIDxyZXR1cm50eXBlPiBmdW5jKGFyZ3MpIHsgYm9keSB9CisgICAgICovCisgICAgdm9pZCBlbWl0RnVuY3Rpb24oSkZ1bmMgamZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gb3V0LAorICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmF0aXZlRGVjbCwgYm9vbGVhbiBpbnRlcmZhY2VEZWNsKSB7CisgICAgICAgIGJvb2xlYW4gaXNQb2ludGVyRnVuYyA9CisgICAgICAgICAgICBqZnVuYy5nZXROYW1lKCkuZW5kc1dpdGgoIlBvaW50ZXIiKSAmJgorICAgICAgICAgICAgamZ1bmMuZ2V0Q0Z1bmMoKS5oYXNQb2ludGVyQXJnKCk7CisKKyAgICAgICAgaWYgKCFuYXRpdmVEZWNsICYmICFpbnRlcmZhY2VEZWNsICYmICFpc1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICAvLyBJZiBpdCdzIG5vdCBhIHBvaW50ZXIgZnVuY3Rpb24sIHdlJ3ZlIGFscmVhZHkgZW1pdHRlZCBpdAorICAgICAgICAgICAgLy8gd2l0aCBuYXRpdmVEZWNsID09IHRydWUKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgKG5hdGl2ZURlY2wgPyAicHJpdmF0ZSBuYXRpdmUgIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgKGludGVyZmFjZURlY2wgPyAiIiA6ICJwdWJsaWMgIikpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldFR5cGUoKSArICIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgKG5hdGl2ZURlY2wgPyAiQm91bmRzIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiKCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChuYXRpdmVEZWNsID8gInB1YmxpYyBuYXRpdmUgIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgKGludGVyZmFjZURlY2wgPyAiIiA6ICJwdWJsaWMgIikpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldFR5cGUoKSArICIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIigiKTsKKyAgICAgICAgfQorCQorICAgICAgICBpbnQgbnVtQXJncyA9IGpmdW5jLmdldE51bUFyZ3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBhcmdOYW1lID0gamZ1bmMuZ2V0QXJnTmFtZShpKTsKKyAgICAgICAgICAgIEpUeXBlIGFyZ1R5cGUgPSBqZnVuYy5nZXRBcmdUeXBlKGkpOworCSAgICAKKyAgICAgICAgICAgIG91dC5wcmludChpbmRlbnQgKyBpbmRlbnQgKyBhcmdUeXBlICsgIiAiICsgYXJnTmFtZSk7CisgICAgICAgICAgICBpZiAoaSA9PSBudW1BcmdzIC0gMSkgeworICAgICAgICAgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jICYmIG5hdGl2ZURlY2wpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsgImludCByZW1haW5pbmciKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYXRpdmVEZWNsIHx8IGludGVyZmFjZURlY2wpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIpOyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIikgeyIpOworCisgICAgICAgICAgICBTdHJpbmcgaWlpID0gaW5kZW50ICsgaW5kZW50OworCisgICAgICAgICAgICBTdHJpbmcgZm5hbWUgPSBqZnVuYy5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBkZWFsIHdpdGggVkJPIHZhcmlhbnRzCisgICAgICAgICAgICAgICAgaWYgKGZuYW1lLmVxdWFscygiZ2xDb2xvclBvaW50ZXIiKSkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiaWYgKChzaXplID09IDQpICYmIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKCh0eXBlID09IEdMX0ZMT0FUKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9GSVhFRCkpICYmIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKHN0cmlkZSA+PSAwKSkgeyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX2NvbG9yUG9pbnRlciA9IHBvaW50ZXI7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbmFtZS5lcXVhbHMoImdsTm9ybWFsUG9pbnRlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoKCh0eXBlID09IEdMX0ZMT0FUKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9CWVRFKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9TSE9SVCkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfRklYRUQpKSAmJiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgIChzdHJpZGUgPj0gMCkpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl9ub3JtYWxQb2ludGVyID0gcG9pbnRlcjsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZuYW1lLmVxdWFscygiZ2xUZXhDb29yZFBvaW50ZXIiKSkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiaWYgKCgoc2l6ZSA9PSAyKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAoc2l6ZSA9PSAzKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAoc2l6ZSA9PSA0KSkgJiYiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoKHR5cGUgPT0gR0xfRkxPQVQpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0JZVEUpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX1NIT1JUKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9GSVhFRCkpICYmIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKHN0cmlkZSA+PSAwKSkgeyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX3RleENvb3JkUG9pbnRlciA9IHBvaW50ZXI7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbmFtZS5lcXVhbHMoImdsVmVydGV4UG9pbnRlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoKChzaXplID09IDIpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgIChzaXplID09IDMpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgIChzaXplID09IDQpKSAmJiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICgodHlwZSA9PSBHTF9GTE9BVCkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfQllURSkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfU0hPUlQpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0ZJWEVEKSkgJiYiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoc3RyaWRlID49IDApKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfdmVydGV4UG9pbnRlciA9IHBvaW50ZXI7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBlbWl0Qm91bmRzQ2hlY2tzKGpmdW5jLCBvdXQsIGlpaSk7CisgICAgICAgICAgICBlbWl0RnVuY3Rpb25DYWxsKGpmdW5jLCBvdXQsIGlpaSwgZmFsc2UpOworCisgICAgICAgICAgICBib29sZWFuIGlzVm9pZCA9IGpmdW5jLmdldFR5cGUoKS5pc1ZvaWQoKTsKKworICAgICAgICAgICAgaWYgKCFpc1ZvaWQpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyAicmV0dXJuIF9yZXR1cm5WYWx1ZTsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJ9Iik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKbmlOYW1lKEpUeXBlIGpUeXBlKSB7CisgICAgICAgIFN0cmluZyBqbmlOYW1lID0gIiI7CisgICAgICAgIGlmIChqVHlwZS5pc0NsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiTCIgKyBqVHlwZS5nZXRCYXNlVHlwZSgpICsgIjsiOworICAgICAgICB9IGVsc2UgaWYgKGpUeXBlLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgam5pTmFtZSA9ICJbIjsKKyAgICAgICAgfQorCQorICAgICAgICBTdHJpbmcgYmFzZVR5cGUgPSBqVHlwZS5nZXRCYXNlVHlwZSgpOworICAgICAgICBpZiAoYmFzZVR5cGUuZXF1YWxzKCJpbnQiKSkgeworICAgICAgICAgICAgam5pTmFtZSArPSAiSSI7CisgICAgICAgIH0gZWxzZSBpZiAoYmFzZVR5cGUuZXF1YWxzKCJmbG9hdCIpKSB7CisgICAgICAgICAgICBqbmlOYW1lICs9ICJGIjsKKyAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoImJvb2xlYW4iKSkgeworICAgICAgICAgICAgam5pTmFtZSArPSAiWiI7CisgICAgICAgIH0gZWxzZSBpZiAoYmFzZVR5cGUuZXF1YWxzKCJzaG9ydCIpKSB7CisgICAgICAgICAgICBqbmlOYW1lICs9ICJTIjsKKyAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoImxvbmciKSkgeworICAgICAgICAgICAgam5pTmFtZSArPSAiTCI7CisgICAgICAgIH0gZWxzZSBpZiAoYmFzZVR5cGUuZXF1YWxzKCJieXRlIikpIHsKKyAgICAgICAgICAgIGpuaU5hbWUgKz0gIkIiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBqbmlOYW1lOworICAgIH0KKworICAgIFN0cmluZyBnZXRKbmlUeXBlKEpUeXBlIGpUeXBlKSB7CisgICAgICAgIGlmIChqVHlwZS5pc1ZvaWQoKSkgeworICAgICAgICAgICAgcmV0dXJuICJ2b2lkIjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBiYXNlVHlwZSA9IGpUeXBlLmdldEJhc2VUeXBlKCk7CisgICAgICAgIGlmIChqVHlwZS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICBpZiAoYmFzZVR5cGUuZXF1YWxzKCJTdHJpbmciKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAianN0cmluZyI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAiaiIgKyBiYXNlVHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChqVHlwZS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiaiIgKyBiYXNlVHlwZSArICJBcnJheSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gImpvYmplY3QiOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIFN0cmluZyBnZXRKbmlNYW5nbGVkTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsKCJfIiwgIl8xIik7CisgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIjsiLCAiXzIiKTsKKyAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgiXFxbIiwgIl8zIik7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVtaXRKbmlDb2RlKEpGdW5jIGpmdW5jLCBQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgQ0Z1bmMgY2Z1bmMgPSBqZnVuYy5nZXRDRnVuYygpOworCQorICAgICAgICAvLyBFbWl0IGNvbW1lbnQgaWRlbnRpZnlpbmcgb3JpZ2luYWwgQyBmdW5jdGlvbgorICAgICAgICAvLworICAgICAgICAvLyBFeGFtcGxlOgorICAgICAgICAvLworICAgICAgICAvLyAvKiB2b2lkIGdsQ2xpcFBsYW5lZiAoIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24gKSAqLworICAgICAgICAvLworICAgICAgICBvdXQucHJpbnRsbigiLyogIiArIGNmdW5jLmdldE9yaWdpbmFsKCkgKyAiICovIik7CisKKyAgICAgICAgLy8gRW1pdCBKTkkgc2lnbmF0dXJlIChuYW1lKQorICAgICAgICAvLworICAgICAgICAvLyBFeGFtcGxlOgorICAgICAgICAvLworICAgICAgICAvLyB2b2lkCisgICAgICAgIC8vIGFuZHJvaWRfZ2xDbGlwUGxhbmVmX19JXzNGSQorICAgICAgICAvLworCisgICAgICAgIFN0cmluZyBvdXROYW1lID0gImFuZHJvaWRfIiArIGpmdW5jLmdldE5hbWUoKTsKKyAgICAgICAgYm9vbGVhbiBpc1BvaW50ZXJGdW5jID0gb3V0TmFtZS5lbmRzV2l0aCgiUG9pbnRlciIpICYmCisgICAgICAgICAgICBqZnVuYy5nZXRDRnVuYygpLmhhc1BvaW50ZXJBcmcoKTsKKyAgICAgICAgYm9vbGVhbiBpc1ZCT1BvaW50ZXJGdW5jID0gKG91dE5hbWUuZW5kc1dpdGgoIlBvaW50ZXIiKSB8fAorICAgICAgICAgICAgb3V0TmFtZS5lbmRzV2l0aCgiRHJhd0VsZW1lbnRzIikpICYmCisgICAgICAgICAgICAhamZ1bmMuZ2V0Q0Z1bmMoKS5oYXNQb2ludGVyQXJnKCk7CisgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICBvdXROYW1lICs9ICJCb3VuZHMiOworICAgICAgICB9CisKKyAgICAgICAgb3V0LnByaW50KCJzdGF0aWMgIik7CisgICAgICAgIG91dC5wcmludGxuKGdldEpuaVR5cGUoamZ1bmMuZ2V0VHlwZSgpKSk7CisgICAgICAgIG91dC5wcmludChvdXROYW1lKTsKKworICAgICAgICBTdHJpbmcgcnNpZ25hdHVyZSA9IGdldEpuaU5hbWUoamZ1bmMuZ2V0VHlwZSgpKTsKKworICAgICAgICBTdHJpbmcgc2lnbmF0dXJlID0gIiI7CisgICAgICAgIGludCBudW1BcmdzID0gamZ1bmMuZ2V0TnVtQXJncygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgeworICAgICAgICAgICAgSlR5cGUgYXJnVHlwZSA9IGpmdW5jLmdldEFyZ1R5cGUoaSk7CisgICAgICAgICAgICBzaWduYXR1cmUgKz0gZ2V0Sm5pTmFtZShhcmdUeXBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgeworICAgICAgICAgICAgc2lnbmF0dXJlICs9ICJJIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFwcGVuZCBzaWduYXR1cmUgdG8gZnVuY3Rpb24gbmFtZQorICAgICAgICBTdHJpbmcgc2lnID0gZ2V0Sm5pTWFuZ2xlZE5hbWUoc2lnbmF0dXJlKS5yZXBsYWNlKCcuJywgJ18nKTsgICAgICAgIAorICAgICAgICBvdXQucHJpbnQoIl9fIiArIHNpZyk7CisgICAgICAgIG91dE5hbWUgKz0gIl9fIiArIHNpZzsKKwkKKyAgICAgICAgc2lnbmF0dXJlID0gc2lnbmF0dXJlLnJlcGxhY2UoJy4nLCAnLycpOworICAgICAgICByc2lnbmF0dXJlID0gcnNpZ25hdHVyZS5yZXBsYWNlKCcuJywgJy8nKTsKKwkKKyAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgaWYgKHJzaWduYXR1cmUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcnNpZ25hdHVyZSA9ICJWIjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBzID0gIntcIiIgKworICAgICAgICAgICAgamZ1bmMuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgIChpc1BvaW50ZXJGdW5jID8gIkJvdW5kcyIgOiAiIikgKworICAgICAgICAgICAgIlwiLCBcIigiICsgc2lnbmF0dXJlICsiKSIgKworICAgICAgICAgICAgcnNpZ25hdHVyZSArCisgICAgICAgICAgICAiXCIsICh2b2lkICopICIgKworICAgICAgICAgICAgb3V0TmFtZSArCisgICAgICAgICAgICAiIH0sIjsKKyAgICAgICAgbmF0aXZlUmVnaXN0cmF0aW9ucy5hZGQocyk7CisKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBub25QcmltaXRpdmVBcmdzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICBpbnQgbnVtQnVmZmVyQXJncyA9IDA7CisgICAgICAgIExpc3Q8U3RyaW5nPiBidWZmZXJBcmdOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisgICAgICAgIC8vIEVtaXQgSk5JIHNpZ25hdHVyZSAoYXJndW1lbnRzKQorICAgICAgICAvLworICAgICAgICAvLyBFeGFtcGxlOgorICAgICAgICAvLworICAgICAgICAvLyAoSk5JRW52ICpfZW52LCBqb2JqZWN0IHRoaXMsIGppbnQgcGxhbmUsIGpmbG9hdEFycmF5IGVxdWF0aW9uX3JlZiwgamludCBvZmZzZXQpIHsKKyAgICAgICAgLy8KKyAgICAgICAgb3V0LnByaW50KCIgIChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKKyAgICAgICAgICAgIG91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICAgIEpUeXBlIGFyZ1R5cGUgPSBqZnVuYy5nZXRBcmdUeXBlKGkpOworICAgICAgICAgICAgU3RyaW5nIHN1ZmZpeDsKKyAgICAgICAgICAgIGlmICghYXJnVHlwZS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ1R5cGUuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJfcmVmIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAiX2J1ZiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vblByaW1pdGl2ZUFyZ3MuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKKyAgICAgICAgICAgICAgICBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpKS5pc0J1ZmZlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IGNmdW5jLmdldEFyZ05hbWUoY0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyQXJnTmFtZXMuYWRkKGNuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbnVtQnVmZmVyQXJncysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3VmZml4ID0gIiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dC5wcmludChnZXRKbmlUeXBlKGFyZ1R5cGUpICsgIiAiICsgamZ1bmMuZ2V0QXJnTmFtZShpKSArIHN1ZmZpeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgIG91dC5wcmludCgiLCBqaW50IHJlbWFpbmluZyIpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludGxuKCIpIHsiKTsKKwkKKyAgICAgICAgaW50IG51bUFycmF5cyA9IDA7CisgICAgICAgIGludCBudW1CdWZmZXJzID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub25QcmltaXRpdmVBcmdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaWR4ID0gbm9uUHJpbWl0aXZlQXJncy5nZXQoaSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KTsKKyAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IGNmdW5jLmdldEFyZ05hbWUoY0luZGV4KTsKKyAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgKytudW1BcnJheXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpZHgpLmlzQnVmZmVyKCkpIHsKKyAgICAgICAgICAgICAgICArK251bUJ1ZmZlcnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBFbWl0IG1ldGhvZCBib2R5CisKKyAgICAgICAgLy8gRW1pdCBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgZm9yIF9leGNlcHRpb24gYW5kIF9yZXR1cm5WYWx1ZQorICAgICAgICAvLworICAgICAgICAvLyBFeGFtcGxlOgorICAgICAgICAvLworICAgICAgICAvLyBhbmRyb2lkOjpnbDo6b2dsZXNfY29udGV4dF90ICpjdHg7CisgICAgICAgIC8vIAorICAgICAgICAvLyBqaW50IF9leGNlcHRpb247CisgICAgICAgIC8vIEdMZW51bSBfcmV0dXJuVmFsdWU7CisgICAgICAgIC8vCisgICAgICAgIENUeXBlIHJldHVyblR5cGUgPSBjZnVuYy5nZXRUeXBlKCk7CisgICAgICAgIGJvb2xlYW4gaXNWb2lkID0gcmV0dXJuVHlwZS5pc1ZvaWQoKTsKKworICAgICAgICBib29sZWFuIGlzVW5zdXBwb3J0ZWQgPSBpc1Vuc3VwcG9ydGVkRnVuYyhjZnVuYyk7CisgICAgICAgIGlmIChpc1Vuc3VwcG9ydGVkKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgIl9lbnYtPlRocm93TmV3KFVPRUNsYXNzLCIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgXCIiICsgY2Z1bmMuZ2V0TmFtZSgpICsgIlwiKTsiKTsKKyAgICAgICAgICAgIGlmICghaXNWb2lkKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJldHZhbCA9IGdldEVycm9yUmV0dXJuVmFsdWUoY2Z1bmMpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJyZXR1cm4gIiArIHJldHZhbCArICI7Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnRsbigifSIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtVXNlQ29udGV4dFBvaW50ZXIpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgImFuZHJvaWQ6OmdsOjpvZ2xlc19jb250ZXh0X3QgKmN0eCA9IGdldENvbnRleHQoX2VudiwgX3RoaXMpOyIpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBlbWl0RXhjZXB0aW9uQ2hlY2sgPSAobnVtQXJyYXlzID4gMCB8fCBudW1CdWZmZXJzID4gMCkgJiYKKyAgICAgICAgICAgIGhhc05vbkNvbnN0QXJnKGpmdW5jLCBjZnVuYywgbm9uUHJpbWl0aXZlQXJncyk7CisgICAgICAgIC8vIG1DaGVja2VyLmdldENoZWNrcyhjZnVuYy5nZXROYW1lKCkpICE9IG51bGwKKworICAgICAgICAvLyBFbWl0IGFuIF9leGVwdGlvbiB2YXJpYWJsZSBpZiB0aGVyZSB3aWxsIGJlIGVycm9yIGNoZWNrcworICAgICAgICBpZiAoZW1pdEV4Y2VwdGlvbkNoZWNrKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiamludCBfZXhjZXB0aW9uID0gMDsiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVtaXQgYSBzaW5nbGUgX2FycmF5IG9yIG11bHRpcGxlIF9YWFhBcnJheSB2YXJpYWJsZXMKKyAgICAgICAgaWYgKG51bUJ1ZmZlckFyZ3MgPT0gMSkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJqYXJyYXkgX2FycmF5ID0gKGphcnJheSkgMDsiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQnVmZmVyQXJnczsgaSsrKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgImphcnJheSBfIiArIGJ1ZmZlckFyZ05hbWVzLmdldChpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFycmF5ID0gKGphcnJheSkgMDsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzVm9pZCkgeworICAgICAgICAgICAgU3RyaW5nIHJldHZhbCA9IGdldEVycm9yUmV0dXJuVmFsdWUoY2Z1bmMpOworICAgICAgICAgICAgaWYgKHJldHZhbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgcmV0dXJuVHlwZS5nZXREZWNsYXJhdGlvbigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIF9yZXR1cm5WYWx1ZSA9ICIgKyByZXR2YWwgKyAiOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyByZXR1cm5UeXBlLmdldERlY2xhcmF0aW9uKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgX3JldHVyblZhbHVlOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRW1pdCBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgZm9yIHBvaW50ZXIgYXJndW1lbnRzCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIEdMZml4ZWQgKmVxbl9iYXNlOworICAgICAgICAvLyBHTGZpeGVkICplcW47CisgICAgICAgIC8vCisgICAgICAgIFN0cmluZyBvZmZzZXQgPSAib2Zmc2V0IjsKKyAgICAgICAgU3RyaW5nIHJlbWFpbmluZyA9ICJfcmVtYWluaW5nIjsKKyAgICAgICAgaWYgKG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub25QcmltaXRpdmVBcmdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IG5vblByaW1pdGl2ZUFyZ3MuZ2V0KGkpLmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpZHgpOworICAgICAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IGNmdW5jLmdldEFyZ05hbWUoY0luZGV4KTsKKworICAgICAgICAgICAgICAgIENUeXBlIHR5cGUgPSBjZnVuYy5nZXRBcmdUeXBlKGpmdW5jLmdldEFyZ0NJbmRleChpZHgpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGVjbCA9IHR5cGUuZ2V0RGVjbGFyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpZHgpLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlY2wuZW5kc1dpdGgoIioiKSA/ICIiIDogIiAiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldEFyZ05hbWUoaWR4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfYmFzZSA9ICgiICsgZGVjbCArICIpIDA7Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IChudW1BcnJheXMgPD0gMSAmJiBudW1CdWZmZXJzIDw9IDEpID8gIl9yZW1haW5pbmciIDoKKyAgICAgICAgICAgICAgICAgICAgIl8iICsgY25hbWUgKyAiUmVtYWluaW5nIjsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqaW50ICIgKyByZW1haW5pbmcgKyAiOyIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlY2wuZW5kc1dpdGgoIioiKSA/ICIiIDogIiAiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0QXJnTmFtZShpZHgpICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA9ICgiICsgZGVjbCArICIpIDA7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmV0dmFsID0gaXNWb2lkID8gIiIgOiAiIF9yZXR1cm5WYWx1ZSI7CisKKyAgICAgICAgLy8gRW1pdCAnR2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbCcgZm9yIGFycmF5cworICAgICAgICAvLyBFbWl0ICdHZXRQb2ludGVyJyBjYWxscyBmb3IgQnVmZmVyIHBvaW50ZXJzCisgICAgICAgIGludCBidWZBcmdJZHggPSAwOworICAgICAgICBpZiAobm9uUHJpbWl0aXZlQXJncy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gbm9uUHJpbWl0aXZlQXJncy5nZXQoaSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpbnQgY0luZGV4ID0gamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCk7CisJCQorICAgICAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IGNmdW5jLmdldEFyZ05hbWUoY0luZGV4KTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBudW1BcnJheXMgPD0gMSA/ICJvZmZzZXQiIDoKKyAgICAgICAgICAgICAgICAgICAgY25hbWUgKyAiT2Zmc2V0IjsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgPSAobnVtQXJyYXlzIDw9IDEgJiYgbnVtQnVmZmVycyA8PSAxKSA/ICJfcmVtYWluaW5nIiA6CisgICAgICAgICAgICAgICAgICAgICJfIiArIGNuYW1lICsgIlJlbWFpbmluZyI7CisKKyAgICAgICAgICAgICAgICBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpZHgpLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWYgKCEiICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9yZWYpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVtaXRFeGNlcHRpb25DaGVjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsgIl9leGNlcHRpb24gPSAxOyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIgICAgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPlRocm93TmV3KCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICIiIDogIl9lbnYsICIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklBRUNsYXNzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIGNuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA9PSBudWxsXCIpOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiICAgIGdvdG8gZXhpdDsiKTsKKyAgICAgICAgICAgICAgICAgICAgbmVlZHNFeGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKKworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiaWYgKCIgKyBvZmZzZXQgKyAiIDwgMCkgeyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW1pdEV4Y2VwdGlvbkNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyAiX2V4Y2VwdGlvbiA9IDE7Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+VGhyb3dOZXcoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUFFQ2xhc3MsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgb2Zmc2V0ICsgIiA8IDBcIik7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIgICAgZ290byBleGl0OyIpOworICAgICAgICAgICAgICAgICAgICBuZWVkc0V4aXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOworCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIHJlbWFpbmluZyArICIgPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+R2V0QXJyYXlMZW5ndGgoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICIiIDogIl9lbnYsICIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsgIl9yZWYpIC0gIiArIG9mZnNldCArICI7Iik7CisKKyAgICAgICAgICAgICAgICAgICAgZW1pdE5hdGl2ZUJvdW5kc0NoZWNrcyhjZnVuYywgY25hbWUsIG91dCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEV4Y2VwdGlvbkNoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcmVtYWluaW5nLCAiICAgICIpOworCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9iYXNlID0gKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuZ2V0RGVjbGFyYXRpb24oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIgICAgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0QXJnTmFtZShpZHgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9yZWYsIChqYm9vbGVhbiAqKTApOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSArICIgPSAiICsgY25hbWUgKyAiX2Jhc2UgKyAiICsgb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXJyYXkgPSBudW1CdWZmZXJBcmdzIDw9IDEgPyAiX2FycmF5IiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiXyIgKyBidWZmZXJBcmdOYW1lcy5nZXQoYnVmQXJnSWR4KyspICsgIkFycmF5IjsKKworICAgICAgICAgICAgICAgICAgICBib29sZWFuIG51bGxBbGxvd2VkID0gaXNOdWxsQWxsb3dlZChjZnVuYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChudWxsQWxsb3dlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgImlmICgiICsgY25hbWUgKyAiX2J1ZikgeyIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KGluZGVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA9ICgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Z1bmMuZ2V0QXJnVHlwZShjSW5kZXgpLmdldERlY2xhcmF0aW9uKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKWdldFBvaW50ZXIoX2VudiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9idWYsICYiICsgYXJyYXkgKyAiLCAmIiArIHJlbWFpbmluZyArICIpOyIpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChudWxsQWxsb3dlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVtaXROYXRpdmVCb3VuZHNDaGVja3MoY2Z1bmMsIGNuYW1lLCBvdXQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEV4Y2VwdGlvbkNoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcmVtYWluaW5nLCAiICAgICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNWb2lkKSB7CisgICAgICAgICAgICBvdXQucHJpbnQoaW5kZW50ICsgIl9yZXR1cm5WYWx1ZSA9ICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LnByaW50KGluZGVudCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIG5hbWUgPSBjZnVuYy5nZXROYW1lKCk7CisKKyAgICAgICAgaWYgKG1Vc2VDb250ZXh0UG9pbnRlcikgeworICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIsIG5hbWUubGVuZ3RoKCkpOyAvLyBTdHJpcCBvZmYgJ2dsJyBwcmVmaXgKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsKKyAgICAgICAgICAgICAgICBuYW1lLnN1YnN0cmluZygxLCBuYW1lLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiY3R4LT5wcm9jcy4iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgb3V0LnByaW50KG5hbWUgKyAoaXNQb2ludGVyRnVuYyA/ICJCb3VuZHMiIDogIiIpICsgIigiKTsKKworICAgICAgICBudW1BcmdzID0gY2Z1bmMuZ2V0TnVtQXJncygpOyAgICAKKyAgICAgICAgaWYgKG51bUFyZ3MgPT0gMCkgeworICAgICAgICAgICAgaWYgKG1Vc2VDb250ZXh0UG9pbnRlcikgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJjdHgpOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiKTsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtVXNlQ29udGV4dFBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiY3R4LCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZWNhc3Q7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gbnVtQXJncyAtIDEgJiYgaXNWQk9Qb2ludGVyRnVuYykgeworICAgICAgICAgICAgICAgICAgICB0eXBlY2FzdCA9ICJjb25zdCBHTHZvaWQgKiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZWNhc3QgPSBjZnVuYy5nZXRBcmdUeXBlKGkpLmdldERlY2xhcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5wcmludChpbmRlbnQgKyBpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlY2FzdCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIpIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNmdW5jLmdldEFyZ05hbWUoaSkpOworCisgICAgICAgICAgICAgICAgaWYgKGkgPT0gbnVtQXJncyAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIsIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyAiKEdMc2l6ZWkpcmVtYWluaW5nIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiKTsiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZWVkc0V4aXQpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiZXhpdDoiKTsKKyAgICAgICAgICAgIG5lZWRzRXhpdCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgYnVmQXJnSWR4ID0gMDsKKyAgICAgICAgaWYgKG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gbm9uUHJpbWl0aXZlQXJncy5nZXQoaSkuaW50VmFsdWUoKTsKKworICAgICAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KTsKKyAgICAgICAgICAgICAgICBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpZHgpLmlzQXJyYXkoKSkgeworCQkgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhcmd1bWVudCBpcyAnY29uc3QnLCBHTCB3aWxsIG5vdCB3cml0ZSB0byBpdC4KKyAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBjYW4gdXNlIHRoZSAnSk5JX0FCT1JUJyBmbGFnIHRvIGF2b2lkCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZWVkIHRvIHdyaXRlIGJhY2sgdG8gdGhlIEphdmEgYXJyYXkKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlmICgiICsgamZ1bmMuZ2V0QXJnTmFtZShpZHgpICsgIl9iYXNlKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICIiIDogIl9lbnYsICIpICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldEFyZ05hbWUoaWR4KSArICJfcmVmLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9iYXNlLCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyBpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2Z1bmMuZ2V0QXJnVHlwZShjSW5kZXgpLmlzQ29uc3QoKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSk5JX0FCT1JUIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2V4Y2VwdGlvbiA/IEpOSV9BQk9SVDogMCIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJ9Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNCdWZmZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXJyYXkgPSBudW1CdWZmZXJBcmdzIDw9IDEgPyAiX2FycmF5IiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiXyIgKyBidWZmZXJBcmdOYW1lcy5nZXQoYnVmQXJnSWR4KyspICsgIkFycmF5IjsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgImlmICgiICsgYXJyYXkgKyAiKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWxlYXNlUG9pbnRlcihfZW52LCAiICsgYXJyYXkgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuaXNDb25zdCgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKTklfRkFMU0UiIDogIl9leGNlcHRpb24gPyBKTklfRkFMU0UgOiBKTklfVFJVRSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJ9Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc1ZvaWQpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJyZXR1cm4gX3JldHVyblZhbHVlOyIpOworICAgICAgICB9CisKKyAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKKyAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGROYXRpdmVSZWdpc3RyYXRpb24oU3RyaW5nIHMpIHsKKyAgICAgICAgbmF0aXZlUmVnaXN0cmF0aW9ucy5hZGQocyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW1pdE5hdGl2ZVJlZ2lzdHJhdGlvbigpIHsKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigic3RhdGljIGNvbnN0IGNoYXIgKmNsYXNzUGF0aE5hbWUgPSBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgbUNsYXNzUGF0aE5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgIlwiOyIpOworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCk7CisKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigic3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBtZXRob2RzW10gPSB7Iik7CisKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigie1wiX25hdGl2ZUNsYXNzSW5pdFwiLCBcIigpVlwiLCAodm9pZCopbmF0aXZlQ2xhc3NJbml0IH0sIik7CisKKyAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpID0gbmF0aXZlUmVnaXN0cmF0aW9ucy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIG1DU3RyZWFtLnByaW50bG4oaS5uZXh0KCkpOworICAgICAgICB9CisKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigifTsiKTsKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigpOworICAgIAorCisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oImludCByZWdpc3Rlcl9jb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfR0xJbXBsKEpOSUVudiAqX2VudikiKTsKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigieyIpOworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAiaW50IGVycjsiKTsKKworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAiZXJyID0gYW5kcm9pZDo6QW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhfZW52LCBjbGFzc1BhdGhOYW1lLCBtZXRob2RzLCBORUxFTShtZXRob2RzKSk7Iik7CisKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbihpbmRlbnQgKyAicmV0dXJuIGVycjsiKTsKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigifSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvUGFyYW1ldGVyQ2hlY2tlci5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9QYXJhbWV0ZXJDaGVja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyNmFjZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvUGFyYW1ldGVyQ2hlY2tlci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXJDaGVja2VyIHsKKworICAgIEhhc2hNYXA8U3RyaW5nLFN0cmluZ1tdPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nW10+KCk7CisKKyAgICBwdWJsaWMgUGFyYW1ldGVyQ2hlY2tlcihCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgczsKKyAgICAgICAgd2hpbGUgKChzID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHRva2VucyA9IHMuc3BsaXQoIlxccyIpOworICAgICAgICAgICAgbWFwLnB1dCh0b2tlbnNbMF0sIHRva2Vucyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q2hlY2tzKFN0cmluZyBmdW5jdGlvbk5hbWUpIHsKKyAgICAgICAgU3RyaW5nW10gY2hlY2tzID0gbWFwLmdldChmdW5jdGlvbk5hbWUpOworICAgICAgICBpZiAoY2hlY2tzID09IG51bGwgJiYKKyAgICAgICAgICAgIChmdW5jdGlvbk5hbWUuZW5kc1dpdGgoImZ2IikgfHwKKyAgICAgICAgICAgICBmdW5jdGlvbk5hbWUuZW5kc1dpdGgoInh2IikgfHwKKyAgICAgICAgICAgICBmdW5jdGlvbk5hbWUuZW5kc1dpdGgoIml2IikpKSB7CisgICAgICAgICAgICBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWUuc3Vic3RyaW5nKDAsIGZ1bmN0aW9uTmFtZS5sZW5ndGgoKSAtIDIpOworICAgICAgICAgICAgY2hlY2tzID0gbWFwLmdldChmdW5jdGlvbk5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGVja3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTBFeHRIZWFkZXIuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDEwRXh0SGVhZGVyLmphdmEtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5OTljMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDEwRXh0SGVhZGVyLmphdmEtaWYKQEAgLTAsMCArMSwyMiBAQAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKKworcHVibGljIGludGVyZmFjZSBHTDEwRXh0IGV4dGVuZHMgR0wgeworCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTBIZWFkZXIuamF2YS1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzkyODIxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTBIZWFkZXIuamF2YS1pZgpAQCAtMCwwICsxLDI1OSBAQAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKKworcHVibGljIGludGVyZmFjZSBHTDEwIGV4dGVuZHMgR0wgeworICAgIGludCBHTF9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTA0OworICAgIGludCBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgICAgICAgID0gMHg4NDZFOworICAgIGludCBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgICAgICAgID0gMHg4NDZEOworICAgIGludCBHTF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA2OworICAgIGludCBHTF9BTFBIQV9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU1OworICAgIGludCBHTF9BTFBIQV9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkMwOworICAgIGludCBHTF9BTFdBWVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA3OworICAgIGludCBHTF9BTUJJRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAwOworICAgIGludCBHTF9BTUJJRU5UX0FORF9ESUZGVVNFICAgICAgICAgICAgICAgICAgID0gMHgxNjAyOworICAgIGludCBHTF9BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAxOworICAgIGludCBHTF9BTkRfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA0OworICAgIGludCBHTF9BTkRfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAyOworICAgIGludCBHTF9CQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDA1OworICAgIGludCBHTF9CTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkUyOworICAgIGludCBHTF9CTFVFX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU0OworICAgIGludCBHTF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAwOworICAgIGludCBHTF9DQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwOTAxOworICAgIGludCBHTF9DTEFNUF9UT19FREdFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MTJGOworICAgIGludCBHTF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAwOworICAgIGludCBHTF9DT0xPUl9BUlJBWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDc2OworICAgIGludCBHTF9DT0xPUl9CVUZGRVJfQklUICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAwOworICAgIGludCBHTF9DT0xPUl9MT0dJQ19PUCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkYyOworICAgIGludCBHTF9DT0xPUl9NQVRFUklBTCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjU3OworICAgIGludCBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgICAgICAgID0gMHg4NkEzOworICAgIGludCBHTF9DT05TVEFOVF9BVFRFTlVBVElPTiAgICAgICAgICAgICAgICAgID0gMHgxMjA3OworICAgIGludCBHTF9DT1BZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAzOworICAgIGludCBHTF9DT1BZX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBDOworICAgIGludCBHTF9DVUxMX0ZBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjQ0OworICAgIGludCBHTF9DVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwOTAwOworICAgIGludCBHTF9ERUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMTAxOworICAgIGludCBHTF9ERUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAzOworICAgIGludCBHTF9ERVBUSF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU2OworICAgIGludCBHTF9ERVBUSF9CVUZGRVJfQklUICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTAwOworICAgIGludCBHTF9ERVBUSF9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcxOworICAgIGludCBHTF9ESUZGVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAxOworICAgIGludCBHTF9ESVRIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkQwOworICAgIGludCBHTF9ET05UX0NBUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMTAwOworICAgIGludCBHTF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzA0OworICAgIGludCBHTF9EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzA2OworICAgIGludCBHTF9FTUlTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNjAwOworICAgIGludCBHTF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAyOworICAgIGludCBHTF9FUVVJViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA5OworICAgIGludCBHTF9FWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODAwOworICAgIGludCBHTF9FWFAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODAxOworICAgIGludCBHTF9FWFRFTlNJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAzOworICAgIGludCBHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICBpbnQgR0xfRkFTVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTEwMTsKKyAgICBpbnQgR0xfRklYRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwQzsKKyAgICBpbnQgR0xfRkxBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUQwMDsKKyAgICBpbnQgR0xfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwNjsKKyAgICBpbnQgR0xfRk9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2MDsKKyAgICBpbnQgR0xfRk9HX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2NjsKKyAgICBpbnQgR0xfRk9HX0RFTlNJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2MjsKKyAgICBpbnQgR0xfRk9HX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2NDsKKyAgICBpbnQgR0xfRk9HX0hJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEM1NDsKKyAgICBpbnQgR0xfRk9HX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2NTsKKyAgICBpbnQgR0xfRk9HX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2MzsKKyAgICBpbnQgR0xfRlJPTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQwNDsKKyAgICBpbnQgR0xfRlJPTlRfQU5EX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQwODsKKyAgICBpbnQgR0xfR0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNjsKKyAgICBpbnQgR0xfR1JFQVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNDsKKyAgICBpbnQgR0xfR1JFRU5fQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1MzsKKyAgICBpbnQgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTICA9IDB4OEI5QjsKKyAgICBpbnQgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyAgICA9IDB4OEI5QTsKKyAgICBpbnQgR0xfSU5DUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUUwMjsKKyAgICBpbnQgR0xfSU5WQUxJRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMDsKKyAgICBpbnQgR0xfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMjsKKyAgICBpbnQgR0xfSU5WQUxJRF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMTsKKyAgICBpbnQgR0xfSU5WRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwQTsKKyAgICBpbnQgR0xfS0VFUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUUwMDsKKyAgICBpbnQgR0xfTEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMzsKKyAgICBpbnQgR0xfTEVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMTsKKyAgICBpbnQgR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAgICAgICAgICAgICAgICAgICA9IDB4MEI1MzsKKyAgICBpbnQgR0xfTElHSFRfTU9ERUxfVFdPX1NJREUgICAgICAgICAgICAgICAgICA9IDB4MEI1MjsKKyAgICBpbnQgR0xfTElHSFQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMDsKKyAgICBpbnQgR0xfTElHSFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMTsKKyAgICBpbnQgR0xfTElHSFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMjsKKyAgICBpbnQgR0xfTElHSFQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMzsKKyAgICBpbnQgR0xfTElHSFQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNDsKKyAgICBpbnQgR0xfTElHSFQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNTsKKyAgICBpbnQgR0xfTElHSFQ2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNjsKKyAgICBpbnQgR0xfTElHSFQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNzsKKyAgICBpbnQgR0xfTElHSFRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI1MDsKKyAgICBpbnQgR0xfTElORV9MT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMjsKKyAgICBpbnQgR0xfTElORV9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIyMDsKKyAgICBpbnQgR0xfTElORV9TTU9PVEhfSElOVCAgICAgICAgICAgICAgICAgICAgICA9IDB4MEM1MjsKKyAgICBpbnQgR0xfTElORV9TVFJJUCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMzsKKyAgICBpbnQgR0xfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjYwMTsKKyAgICBpbnQgR0xfTElORUFSX0FUVEVOVUFUSU9OICAgICAgICAgICAgICAgICAgICA9IDB4MTIwODsKKyAgICBpbnQgR0xfTElORUFSX01JUE1BUF9MSU5FQVIgICAgICAgICAgICAgICAgICA9IDB4MjcwMzsKKyAgICBpbnQgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICAgICAgICAgICAgICAgICA9IDB4MjcwMTsKKyAgICBpbnQgR0xfTElORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMTsKKyAgICBpbnQgR0xfTFVNSU5BTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwOTsKKyAgICBpbnQgR0xfTFVNSU5BTkNFX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwQTsKKyAgICBpbnQgR0xfTUFYX0VMRU1FTlRTX0lORElDRVMgICAgICAgICAgICAgICAgICA9IDB4ODBFOTsKKyAgICBpbnQgR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTICAgICAgICAgICAgICAgICA9IDB4ODBFODsKKyAgICBpbnQgR0xfTUFYX0xJR0hUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzMTsKKyAgICBpbnQgR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSCAgICAgICAgICAgICA9IDB4MEQzNjsKKyAgICBpbnQgR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggICAgICAgICAgICA9IDB4MEQzODsKKyAgICBpbnQgR0xfTUFYX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzMzsKKyAgICBpbnQgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgICAgICAgICA9IDB4MEQzOTsKKyAgICBpbnQgR0xfTUFYX1RFWFRVUkVfVU5JVFMgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFMjsKKyAgICBpbnQgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzQTsKKyAgICBpbnQgR0xfTU9ERUxWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTcwMDsKKyAgICBpbnQgR0xfTU9EVUxBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjEwMDsKKyAgICBpbnQgR0xfTVVMVElTQU1QTEUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA5RDsKKyAgICBpbnQgR0xfTkFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwRTsKKyAgICBpbnQgR0xfTkVBUkVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjYwMDsKKyAgICBpbnQgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSICAgICAgICAgICAgICAgICA9IDB4MjcwMjsKKyAgICBpbnQgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAgICAgICAgICAgICAgICA9IDB4MjcwMDsKKyAgICBpbnQgR0xfTkVWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMDsKKyAgICBpbnQgR0xfTklDRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTEwMjsKKyAgICBpbnQgR0xfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgaW50IEdMX05PT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDU7CisgICAgaW50IEdMX05PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDg7CisgICAgaW50IEdMX05PUk1BTF9BUlJBWSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNzU7CisgICAgaW50IEdMX05PUk1BTElaRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTE7CisgICAgaW50IEdMX05PVEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDU7CisgICAgaW50IEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgICAgPSAweDg2QTI7CisgICAgaW50IEdMX09ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOworICAgIGludCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICAgICAgICAgICAgICAgICAgID0gMHgwMzA1OworICAgIGludCBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgID0gMHgwMzA3OworICAgIGludCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgID0gMHgwMzAzOworICAgIGludCBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgID0gMHgwMzAxOworICAgIGludCBHTF9PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA3OworICAgIGludCBHTF9PUl9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBEOworICAgIGludCBHTF9PUl9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBCOworICAgIGludCBHTF9PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTA1OworICAgIGludCBHTF9QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDA1OworICAgIGludCBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVMgICAgICAgICAgICAgICAgID0gMHg4QjkyOworICAgIGludCBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgID0gMHg4Qjk0OworICAgIGludCBHTF9QQUxFVFRFNF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgID0gMHg4QjkwOworICAgIGludCBHTF9QQUxFVFRFNF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4QjkzOworICAgIGludCBHTF9QQUxFVFRFNF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4QjkxOworICAgIGludCBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVMgICAgICAgICAgICAgICAgID0gMHg4Qjk3OworICAgIGludCBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgID0gMHg4Qjk5OworICAgIGludCBHTF9QQUxFVFRFOF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgID0gMHg4Qjk1OworICAgIGludCBHTF9QQUxFVFRFOF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4Qjk4OworICAgIGludCBHTF9QQUxFVFRFOF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4Qjk2OworICAgIGludCBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgICAgICAgICAgID0gMHgwQzUwOworICAgIGludCBHTF9QT0lOVF9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjEwOworICAgIGludCBHTF9QT0lOVF9TTU9PVEhfSElOVCAgICAgICAgICAgICAgICAgICAgID0gMHgwQzUxOworICAgIGludCBHTF9QT0lOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwOworICAgIGludCBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFICAgICAgICAgICAgID0gMHg4MTI4OworICAgIGludCBHTF9QT0lOVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjExOworICAgIGludCBHTF9QT0xZR09OX09GRlNFVF9GSUxMICAgICAgICAgICAgICAgICAgID0gMHg4MDM3OworICAgIGludCBHTF9QT0xZR09OX1NNT09USF9ISU5UICAgICAgICAgICAgICAgICAgID0gMHgwQzUzOworICAgIGludCBHTF9QT1NJVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAzOworICAgIGludCBHTF9QUk9KRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNzAxOworICAgIGludCBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04gICAgICAgICAgICAgICAgID0gMHgxMjA5OworICAgIGludCBHTF9SRURfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDUyOworICAgIGludCBHTF9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAxOworICAgIGludCBHTF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyOTAxOworICAgIGludCBHTF9SRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAxOworICAgIGludCBHTF9SRVNDQUxFX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDNBOworICAgIGludCBHTF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA3OworICAgIGludCBHTF9SR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA4OworICAgIGludCBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgICAgICAgID0gMHg4MDlFOworICAgIGludCBHTF9TQU1QTEVfQUxQSEFfVE9fT05FICAgICAgICAgICAgICAgICAgID0gMHg4MDlGOworICAgIGludCBHTF9TQU1QTEVfQ09WRVJBR0UgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEEwOworICAgIGludCBHTF9TQ0lTU09SX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzExOworICAgIGludCBHTF9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBGOworICAgIGludCBHTF9TSElOSU5FU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNjAxOworICAgIGludCBHTF9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAyOworICAgIGludCBHTF9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRDAxOworICAgIGludCBHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRSAgICAgICAgICAgICAgID0gMHgwQjIyOworICAgIGludCBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgICAgICAgID0gMHgwQjEyOworICAgIGludCBHTF9TUEVDVUxBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAyOworICAgIGludCBHTF9TUE9UX0NVVE9GRiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjA2OworICAgIGludCBHTF9TUE9UX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjA0OworICAgIGludCBHTF9TUE9UX0VYUE9ORU5UICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjA1OworICAgIGludCBHTF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzAyOworICAgIGludCBHTF9TUkNfQUxQSEFfU0FUVVJBVEUgICAgICAgICAgICAgICAgICAgID0gMHgwMzA4OworICAgIGludCBHTF9TUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzAwOworICAgIGludCBHTF9TVEFDS19PVkVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAzOworICAgIGludCBHTF9TVEFDS19VTkRFUkZMT1cgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTA0OworICAgIGludCBHTF9TVEVOQ0lMX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU3OworICAgIGludCBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgID0gMHgwNDAwOworICAgIGludCBHTF9TVEVOQ0lMX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkwOworICAgIGludCBHTF9TVUJQSVhFTF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDUwOworICAgIGludCBHTF9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNzAyOworICAgIGludCBHTF9URVhUVVJFXzJEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwREUxOworICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZICAgICAgICAgICAgICAgICAgID0gMHg4MDc4OworICAgIGludCBHTF9URVhUVVJFX0VOViAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMzAwOworICAgIGludCBHTF9URVhUVVJFX0VOVl9DT0xPUiAgICAgICAgICAgICAgICAgICAgID0gMHgyMjAxOworICAgIGludCBHTF9URVhUVVJFX0VOVl9NT0RFICAgICAgICAgICAgICAgICAgICAgID0gMHgyMjAwOworICAgIGludCBHTF9URVhUVVJFX01BR19GSUxURVIgICAgICAgICAgICAgICAgICAgID0gMHgyODAwOworICAgIGludCBHTF9URVhUVVJFX01JTl9GSUxURVIgICAgICAgICAgICAgICAgICAgID0gMHgyODAxOworICAgIGludCBHTF9URVhUVVJFX1dSQVBfUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyODAyOworICAgIGludCBHTF9URVhUVVJFX1dSQVBfVCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyODAzOworICAgIGludCBHTF9URVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMwOworICAgIGludCBHTF9URVhUVVJFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMxOworICAgIGludCBHTF9URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMyOworICAgIGludCBHTF9URVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMzOworICAgIGludCBHTF9URVhUVVJFNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM0OworICAgIGludCBHTF9URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM1OworICAgIGludCBHTF9URVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM2OworICAgIGludCBHTF9URVhUVVJFNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM3OworICAgIGludCBHTF9URVhUVVJFOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM4OworICAgIGludCBHTF9URVhUVVJFOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM5OworICAgIGludCBHTF9URVhUVVJFMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENBOworICAgIGludCBHTF9URVhUVVJFMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENCOworICAgIGludCBHTF9URVhUVVJFMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENDOworICAgIGludCBHTF9URVhUVVJFMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENEOworICAgIGludCBHTF9URVhUVVJFMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENFOworICAgIGludCBHTF9URVhUVVJFMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENGOworICAgIGludCBHTF9URVhUVVJFMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQwOworICAgIGludCBHTF9URVhUVVJFMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQxOworICAgIGludCBHTF9URVhUVVJFMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQyOworICAgIGludCBHTF9URVhUVVJFMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQzOworICAgIGludCBHTF9URVhUVVJFMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ0OworICAgIGludCBHTF9URVhUVVJFMjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ1OworICAgIGludCBHTF9URVhUVVJFMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ2OworICAgIGludCBHTF9URVhUVVJFMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ3OworICAgIGludCBHTF9URVhUVVJFMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ4OworICAgIGludCBHTF9URVhUVVJFMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ5OworICAgIGludCBHTF9URVhUVVJFMjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERBOworICAgIGludCBHTF9URVhUVVJFMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERCOworICAgIGludCBHTF9URVhUVVJFMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERDOworICAgIGludCBHTF9URVhUVVJFMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEREOworICAgIGludCBHTF9URVhUVVJFMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERFOworICAgIGludCBHTF9URVhUVVJFMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERGOworICAgIGludCBHTF9UUklBTkdMRV9GQU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA2OworICAgIGludCBHTF9UUklBTkdMRV9TVFJJUCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA1OworICAgIGludCBHTF9UUklBTkdMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0OworICAgIGludCBHTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTsKKyAgICBpbnQgR0xfVU5QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgICAgICA9IDB4MENGNTsKKyAgICBpbnQgR0xfVU5TSUdORURfQllURSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMTsKKyAgICBpbnQgR0xfVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMzsKKyAgICBpbnQgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAgICAgICAgICAgICAgICA9IDB4ODAzMzsKKyAgICBpbnQgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSAgICAgICAgICAgICAgICA9IDB4ODAzNDsKKyAgICBpbnQgR0xfVU5TSUdORURfU0hPUlRfNV82XzUgICAgICAgICAgICAgICAgICA9IDB4ODM2MzsKKyAgICBpbnQgR0xfVkVORE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUYwMDsKKyAgICBpbnQgR0xfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUYwMjsKKyAgICBpbnQgR0xfVkVSVEVYX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3NDsKKyAgICBpbnQgR0xfWE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwNjsKKyAgICBpbnQgR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExRXh0SGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUV4dEhlYWRlci5qYXZhLWlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZTIxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUV4dEhlYWRlci5qYXZhLWlmCkBAIC0wLDAgKzEsNDAgQEAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisKK3BhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgR0wxMUV4dCBleHRlbmRzIEdMIHsKKyAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyA9IDB4OEI5RTsKKyAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX09FUyAgICAgICAgICAgICAgICA9IDB4ODg0NDsKKyAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1BPSU5URVJfT0VTICAgICAgICA9IDB4ODg0OTsKKyAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1NJWkVfT0VTICAgICAgICAgICA9IDB4ODg0NjsKKyAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1NUUklERV9PRVMgICAgICAgICA9IDB4ODg0ODsKKyAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICA9IDB4ODg0NzsKKyAgICBpbnQgR0xfTUFUUklYX1BBTEVUVEVfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4ODg0MDsKKyAgICBpbnQgR0xfTUFYX1BBTEVUVEVfTUFUUklDRVNfT0VTICAgICAgICAgICAgICA9IDB4ODg0MjsKKyAgICBpbnQgR0xfTUFYX1ZFUlRFWF9VTklUU19PRVMgICAgICAgICAgICAgICAgICA9IDB4ODZBNDsKKyAgICBpbnQgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTICAgICAgICAgICAgICAgICA9IDB4OEI5RDsKKyAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAgICAgICA9IDB4ODg5RTsKKyAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBRDsKKyAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX1BPSU5URVJfT0VTICAgICAgICAgICAgICA9IDB4ODZBQzsKKyAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX1NJWkVfT0VTICAgICAgICAgICAgICAgICA9IDB4ODZBQjsKKyAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX1NUUklERV9PRVMgICAgICAgICAgICAgICA9IDB4ODZBQTsKKyAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICAgICAgICA9IDB4ODZBOTsKKworICAgIHZvaWQgZ2xUZXhQYXJhbWV0ZXJmdihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW0sIGludCBvZmZzZXQpOworCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUV4dGVuc2lvblBhY2tIZWFkZXIuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExRXh0ZW5zaW9uUGFja0hlYWRlci5qYXZhLWlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MDAxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUV4dGVuc2lvblBhY2tIZWFkZXIuamF2YS1pZgpAQCAtMCwwICsxLDEwOCBAQAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKKworcHVibGljIGludGVyZmFjZSBHTDExRXh0ZW5zaW9uUGFjayBleHRlbmRzIEdMIHsKKyAgICBpbnQgR0xfQkxFTkRfRFNUX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MENBOworICAgIGludCBHTF9CTEVORF9EU1RfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQzg7CisgICAgaW50IEdMX0JMRU5EX0VRVUFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwOTsKKyAgICBpbnQgR0xfQkxFTkRfRVFVQVRJT05fQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODNEOworICAgIGludCBHTF9CTEVORF9FUVVBVElPTl9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMDk7CisgICAgaW50IEdMX0JMRU5EX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBDQjsKKyAgICBpbnQgR0xfQkxFTkRfU1JDX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEM5OworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTA7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFMTsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0UyOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UM19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTM7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFNDsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U1OworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UNl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTY7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ3X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFNzsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U4OworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UOV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTk7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxMF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFQTsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDExX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VCOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUM7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxM19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFRDsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDE0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VFOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUY7CisgICAgaW50IEdMX0RFQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUwODsKKyAgICBpbnQgR0xfREVQVEhfQVRUQUNITUVOVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDAwOworICAgIGludCBHTF9ERVBUSF9DT01QT05FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDI7CisgICAgaW50IEdMX0RFUFRIX0NPTVBPTkVOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODFBNTsKKyAgICBpbnQgR0xfREVQVEhfQ09NUE9ORU5UMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MUE2OworICAgIGludCBHTF9ERVBUSF9DT01QT05FTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxQTc7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUVfT0VTICAgICAgICAgICA9IDB4OENEMTsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRV9PRVMgICAgICAgICAgID0gMHg4Q0QwOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRV9PRVMgPSAweDhDRDM7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MRVZFTF9PRVMgICAgICAgICA9IDB4OENEMjsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQklORElOR19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0E2OworICAgIGludCBHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRDU7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVF9PRVMgICAgICAgICAgICA9IDB4OENENjsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TX09FUyAgICAgICAgICAgID0gMHg4Q0Q5OworICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RSQVdfQlVGRkVSX09FUyAgICAgICAgICAgPSAweDhDREI7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRk9STUFUU19PRVMgICAgICAgICAgICAgICA9IDB4OENEQTsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlRfT0VTICAgID0gMHg4Q0Q3OworICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX1JFQURfQlVGRkVSX09FUyAgICAgICAgICAgPSAweDhDREM7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MDsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURURfT0VTICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0REOworICAgIGludCBHTF9GVU5DX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMDY7CisgICAgaW50IEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwQjsKKyAgICBpbnQgR0xfRlVOQ19TVUJUUkFDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDBBOworICAgIGludCBHTF9JTkNSX1dSQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MDc7CisgICAgaW50IEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OX09FUyAgICAgICAgICAgICAgICA9IDB4MDUwNjsKKyAgICBpbnQgR0xfTUFYX0NPTE9SX0FUVEFDSE1FTlRTX09FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0RGOworICAgIGludCBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MUM7CisgICAgaW50IEdMX01BWF9SRU5ERVJCVUZGRVJfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFODsKKyAgICBpbnQgR0xfTUlSUk9SRURfUkVQRUFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MzcwOworICAgIGludCBHTF9OT1JNQUxfTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTE7CisgICAgaW50IEdMX1JFRkxFQ1RJT05fTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxMjsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0FMUEhBX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDUzOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfQklORElOR19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDQTc7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9CTFVFX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1MjsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0RFUFRIX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDU0OworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTE7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9IRUlHSFRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MzsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVF9PRVMgICAgICAgICAgICAgICAgID0gMHg4RDQ0OworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDE7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9SRURfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1MDsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4RDU1OworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfV0lEVEhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDI7CisgICAgaW50IEdMX1JHQjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA1NzsKKyAgICBpbnQgR0xfUkdCNTY1X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDYyOworICAgIGludCBHTF9SR0I4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNTE7CisgICAgaW50IEdMX1JHQkE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA1NjsKKyAgICBpbnQgR0xfUkdCQTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDU4OworICAgIGludCBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhEMjA7CisgICAgaW50IEdMX1NURU5DSUxfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwMTsKKyAgICBpbnQgR0xfU1RFTkNJTF9JTkRFWDFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQ2OworICAgIGludCBHTF9TVEVOQ0lMX0lOREVYNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDc7CisgICAgaW50IEdMX1NURU5DSUxfSU5ERVg4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0ODsKKyAgICBpbnQgR0xfU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTE7CisgICAgaW50IEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxNDsKKyAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTEzOworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ggICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTY7CisgICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWSAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxODsKKyAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTFBOworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTU7CisgICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWSAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxNzsKKyAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE5OworICAgIGludCBHTF9URVhUVVJFX0dFTl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI1MDA7CisgICAgaW50IEdMX1RFWFRVUkVfR0VOX1NUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ2MDsKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFIZWFkZXIuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExSGVhZGVyLmphdmEtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlNWE2YgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExSGVhZGVyLmphdmEtaWYKQEAgLTAsMCArMSwxNDUgQEAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisKK3BhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgR0wxMSBleHRlbmRzIEdMMTAgeworICAgIGludCBHTF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RTA7CisgICAgaW50IEdMX0FERF9TSUdORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3NDsKKyAgICBpbnQgR0xfQUxQSEFfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDFDOworICAgIGludCBHTF9BTFBIQV9URVNUX0ZVTkMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQzE7CisgICAgaW50IEdMX0FMUEhBX1RFU1RfUkVGICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJDMjsKKyAgICBpbnQgR0xfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODkyOworICAgIGludCBHTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICAgICAgICAgPSAweDg4OTQ7CisgICAgaW50IEdMX0JMRU5EX0RTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJFMDsKKyAgICBpbnQgR0xfQkxFTkRfU1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkUxOworICAgIGludCBHTF9CVUZGRVJfQUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4QkI7CisgICAgaW50IEdMX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODc2NDsKKyAgICBpbnQgR0xfQlVGRkVSX1VTQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NzY1OworICAgIGludCBHTF9DTElFTlRfQUNUSVZFX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgPSAweDg0RTE7CisgICAgaW50IEdMX0NMSVBfUExBTkUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwMDsKKyAgICBpbnQgR0xfQ0xJUF9QTEFORTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDAxOworICAgIGludCBHTF9DTElQX1BMQU5FMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDI7CisgICAgaW50IEdMX0NMSVBfUExBTkUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwMzsKKyAgICBpbnQgR0xfQ0xJUF9QTEFORTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDA0OworICAgIGludCBHTF9DTElQX1BMQU5FNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDU7CisgICAgaW50IEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgICA9IDB4ODg5ODsKKyAgICBpbnQgR0xfQ09MT1JfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgID0gMHg4MDkwOworICAgIGludCBHTF9DT0xPUl9BUlJBWV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwODE7CisgICAgaW50IEdMX0NPTE9SX0FSUkFZX1NUUklERSAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA4MzsKKyAgICBpbnQgR0xfQ09MT1JfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDgyOworICAgIGludCBHTF9DT0xPUl9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDMjI7CisgICAgaW50IEdMX0NPTE9SX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMyMzsKKyAgICBpbnQgR0xfQ09NQklORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTcwOworICAgIGludCBHTF9DT01CSU5FX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzI7CisgICAgaW50IEdMX0NPTUJJTkVfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3MTsKKyAgICBpbnQgR0xfQ09OU1RBTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc2OworICAgIGludCBHTF9DT09SRF9SRVBMQUNFX09FUyAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4NjI7CisgICAgaW50IEdMX0NVTExfRkFDRV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI0NTsKKyAgICBpbnQgR0xfQ1VSUkVOVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjAwOworICAgIGludCBHTF9DVVJSRU5UX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMDI7CisgICAgaW50IEdMX0NVUlJFTlRfVEVYVFVSRV9DT09SRFMgICAgICAgICAgICAgICAgICA9IDB4MEIwMzsKKyAgICBpbnQgR0xfREVQVEhfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjczOworICAgIGludCBHTF9ERVBUSF9GVU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzQ7CisgICAgaW50IEdMX0RFUFRIX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI3MDsKKyAgICBpbnQgR0xfREVQVEhfV1JJVEVNQVNLICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcyOworICAgIGludCBHTF9ET1QzX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg2QUU7CisgICAgaW50IEdMX0RPVDNfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBRjsKKyAgICBpbnQgR0xfRFlOQU1JQ19EUkFXICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEU4OworICAgIGludCBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgPSAweDg4OTM7CisgICAgaW50IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICA9IDB4ODg5NTsKKyAgICBpbnQgR0xfRlJPTlRfRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjQ2OworICAgIGludCBHTF9HRU5FUkFURV9NSVBNQVAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxOTE7CisgICAgaW50IEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UICAgICAgICAgICAgICAgICAgICA9IDB4ODE5MjsKKyAgICBpbnQgR0xfSU5URVJQT0xBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc1OworICAgIGludCBHTF9MSU5FX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMjE7CisgICAgaW50IEdMX0xPR0lDX09QX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJGMDsKKyAgICBpbnQgR0xfTUFUUklYX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkEwOworICAgIGludCBHTF9NQVhfQ0xJUF9QTEFORVMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMzI7CisgICAgaW50IEdMX01PREVMVklFV19NQVRSSVggICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBNjsKKyAgICBpbnQgR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgID0gMHg4OThEOworICAgIGludCBHTF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggICAgICAgICAgICAgICAgICAgPSAweDBCQTM7CisgICAgaW50IEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICA9IDB4ODg5NzsKKyAgICBpbnQgR0xfTk9STUFMX0FSUkFZX1BPSU5URVIgICAgICAgICAgICAgICAgICAgID0gMHg4MDhGOworICAgIGludCBHTF9OT1JNQUxfQVJSQVlfU1RSSURFICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0Y7CisgICAgaW50IEdMX05PUk1BTF9BUlJBWV9UWVBFICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3RTsKKyAgICBpbnQgR0xfT1BFUkFORDBfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTk4OworICAgIGludCBHTF9PUEVSQU5EMF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTA7CisgICAgaW50IEdMX09QRVJBTkQxX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5OTsKKyAgICBpbnQgR0xfT1BFUkFORDFfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTkxOworICAgIGludCBHTF9PUEVSQU5EMl9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OUE7CisgICAgaW50IEdMX09QRVJBTkQyX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5MjsKKyAgICBpbnQgR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT04gICAgICAgICAgICAgID0gMHg4MTI5OworICAgIGludCBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFICAgICAgICAgICAgICAgPSAweDgxMjg7CisgICAgaW50IEdMX1BPSU5UX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIxMTsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9CVUZGRVJfQklORElOR19PRVMgICAgID0gMHg4QjlGOworICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOUM7CisgICAgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICA9IDB4ODk4QzsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9TVFJJREVfT0VTICAgICAgICAgICAgID0gMHg4OThCOworICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICAgICAgPSAweDg5OEE7CisgICAgaW50IEdMX1BPSU5UX1NJWkVfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODEyNzsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MTI2OworICAgIGludCBHTF9QT0lOVF9TUFJJVEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4NjE7CisgICAgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUiAgICAgICAgICAgICAgICAgICA9IDB4ODAzODsKKyAgICBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMgICAgICAgICAgICAgICAgICAgID0gMHgyQTAwOworICAgIGludCBHTF9QUkVWSU9VUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1Nzg7CisgICAgaW50IEdMX1BSSU1BUllfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3NzsKKyAgICBpbnQgR0xfUFJPSkVDVElPTl9NQVRSSVggICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkE3OworICAgIGludCBHTF9QUk9KRUNUSU9OX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgPSAweDg5OEU7CisgICAgaW50IEdMX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggICAgICAgICAgICAgICAgICA9IDB4MEJBNDsKKyAgICBpbnQgR0xfUkdCX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTczOworICAgIGludCBHTF9TQU1QTEVfQlVGRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQTg7CisgICAgaW50IEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQgICAgICAgICAgICAgICAgICA9IDB4ODBBQjsKKyAgICBpbnQgR0xfU0FNUExFX0NPVkVSQUdFX1ZBTFVFICAgICAgICAgICAgICAgICAgID0gMHg4MEFBOworICAgIGludCBHTF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQTk7CisgICAgaW50IEdMX1NDSVNTT1JfQk9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMxMDsKKyAgICBpbnQgR0xfU0hBREVfTU9ERUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjU0OworICAgIGludCBHTF9TUkMwX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODg7CisgICAgaW50IEdMX1NSQzBfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4MDsKKyAgICBpbnQgR0xfU1JDMV9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTg5OworICAgIGludCBHTF9TUkMxX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODE7CisgICAgaW50IEdMX1NSQzJfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4QTsKKyAgICBpbnQgR0xfU1JDMl9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTgyOworICAgIGludCBHTF9TVEFUSUNfRFJBVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4RTQ7CisgICAgaW50IEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MTsKKyAgICBpbnQgR0xfU1RFTkNJTF9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjk0OworICAgIGludCBHTF9TVEVOQ0lMX0ZVTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTI7CisgICAgaW50IEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMICAgICAgICAgICAgICAgICA9IDB4MEI5NTsKKyAgICBpbnQgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MgICAgICAgICAgICAgICAgID0gMHgwQjk2OworICAgIGludCBHTF9TVEVOQ0lMX1JFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTc7CisgICAgaW50IEdMX1NURU5DSUxfVkFMVUVfTUFTSyAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MzsKKyAgICBpbnQgR0xfU1RFTkNJTF9XUklURU1BU0sgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjk4OworICAgIGludCBHTF9TVUJUUkFDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RTc7CisgICAgaW50IEdMX1RFWFRVUkVfQklORElOR18yRCAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA2OTsKKyAgICBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgID0gMHg4ODlBOworICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVIgICAgICAgICAgICAgPSAweDgwOTI7CisgICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRSAgICAgICAgICAgICAgICA9IDB4ODA4ODsKKyAgICBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUgICAgICAgICAgICAgID0gMHg4MDhBOworICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAgPSAweDgwODk7CisgICAgaW50IEdMX1RFWFRVUkVfTUFUUklYICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBODsKKyAgICBpbnQgR0xfVEVYVFVSRV9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTICAgID0gMHg4OThGOworICAgIGludCBHTF9URVhUVVJFX1NUQUNLX0RFUFRIICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTU7CisgICAgaW50IEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICA9IDB4ODg5NjsKKyAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX1BPSU5URVIgICAgICAgICAgICAgICAgICAgID0gMHg4MDhFOworICAgIGludCBHTF9WRVJURVhfQVJSQVlfU0laRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0E7CisgICAgaW50IEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3QzsKKyAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdCOworICAgIGludCBHTF9WSUVXUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTI7CisgICAgaW50IEdMX1dSSVRFX09OTFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhCOTsKKworICAgIHZvaWQgZ2xHZXRQb2ludGVydihpbnQgcG5hbWUsIGphdmEubmlvLkJ1ZmZlcltdIHBhcmFtcyk7CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUltcGxIZWFkZXIuamF2YS1pbXBsIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFJbXBsSGVhZGVyLmphdmEtaW1wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDFiZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFJbXBsSGVhZGVyLmphdmEtaW1wbApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQuZ2xlc19qbmk7CisKK2ltcG9ydCBqYXZhLm5pby5CdWZmZXI7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKKworcHVibGljIGNsYXNzIEdMMTFJbXBsIGltcGxlbWVudHMgR0wxMSB7CisKKyAgICAvLyBQcml2YXRlIGFjY2Vzc29ycyBmb3IgbmF0aXZlIGNvZGUKKworICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyB2b2lkIF9uYXRpdmVDbGFzc0luaXQoKTsKKyAgICBzdGF0aWMgeworCV9uYXRpdmVDbGFzc0luaXQoKTsKKyAgICB9CisKKyAgICBCdWZmZXIgX2NvbG9yUG9pbnRlciA9IG51bGw7CisgICAgQnVmZmVyIF9ub3JtYWxQb2ludGVyID0gbnVsbDsKKyAgICBCdWZmZXIgX3RleENvb3JkUG9pbnRlciA9IG51bGw7CisgICAgQnVmZmVyIF92ZXJ0ZXhQb2ludGVyID0gbnVsbDsKKworICAgIHB1YmxpYyBHTDExSW1wbCgpIHsKKyAgICB9CisKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMQ0hlYWRlci5jcHAgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0xDSGVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDk1Njg2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMQ0hlYWRlci5jcHAKQEAgLTAsMCArMSwxMjkgQEAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisKKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKyNpbmNsdWRlIDxwcml2YXRlL29wZW5nbGVzL2dsX2NvbnRleHQuaD4KKworI2RlZmluZSBfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIFwKKyAgICAgICAgKDo6YW5kcm9pZDo6T0dMRVNfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTKQorCitzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKworc3RhdGljIGpjbGFzcyBuaW9BY2Nlc3NDbGFzczsKK3N0YXRpYyBqY2xhc3MgYnVmZmVyQ2xhc3M7CitzdGF0aWMgamNsYXNzIE9PTUVDbGFzczsKK3N0YXRpYyBqY2xhc3MgVU9FQ2xhc3M7CitzdGF0aWMgamNsYXNzIElBRUNsYXNzOworc3RhdGljIGpjbGFzcyBBSU9PQkVDbGFzczsKK3N0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZVBvaW50ZXJJRDsKK3N0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZUFycmF5SUQ7CitzdGF0aWMgam1ldGhvZElEIGdldEJhc2VBcnJheU9mZnNldElEOworc3RhdGljIGpmaWVsZElEIHBvc2l0aW9uSUQ7CitzdGF0aWMgamZpZWxkSUQgbGltaXRJRDsKK3N0YXRpYyBqZmllbGRJRCBlbGVtZW50U2l6ZVNoaWZ0SUQ7CisKKy8qIENhY2hlIG1ldGhvZCBJRHMgZWFjaCB0aW1lIHRoZSBjbGFzcyBpcyBsb2FkZWQuICovCisKK3ZvaWQKK25hdGl2ZUNsYXNzSW5pdEJ1ZmZlcihKTklFbnYgKl9lbnYpCit7CisgICAgamNsYXNzIG5pb0FjY2Vzc0NsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL05JT0FjY2VzcyIpOworICAgIG5pb0FjY2Vzc0NsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKG5pb0FjY2Vzc0NsYXNzTG9jYWwpOworCisgICAgamNsYXNzIGJ1ZmZlckNsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL0J1ZmZlciIpOworICAgIGJ1ZmZlckNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKGJ1ZmZlckNsYXNzTG9jYWwpOworCisgICAgZ2V0QmFzZVBvaW50ZXJJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAorICAgICAgICAgICAgImdldEJhc2VQb2ludGVyIiwgIihMamF2YS9uaW8vQnVmZmVyOylKIik7CisgICAgZ2V0QmFzZUFycmF5SUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKKyAgICAgICAgICAgICJnZXRCYXNlQXJyYXkiLCAiKExqYXZhL25pby9CdWZmZXI7KUxqYXZhL2xhbmcvT2JqZWN0OyIpOworICAgIGdldEJhc2VBcnJheU9mZnNldElEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCisgICAgICAgICAgICAiZ2V0QmFzZUFycmF5T2Zmc2V0IiwgIihMamF2YS9uaW8vQnVmZmVyOylJIik7CisKKyAgICBwb3NpdGlvbklEID0gX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgInBvc2l0aW9uIiwgIkkiKTsKKyAgICBsaW1pdElEID0gX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgImxpbWl0IiwgIkkiKTsKKyAgICBlbGVtZW50U2l6ZVNoaWZ0SUQgPQorICAgICAgICBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAiX2VsZW1lbnRTaXplU2hpZnQiLCAiSSIpOworfQorCisKK3N0YXRpYyB2b2lkCituYXRpdmVDbGFzc0luaXQoSk5JRW52ICpfZW52LCBqY2xhc3MgZ2xJbXBsQ2xhc3MpCit7CisgICAgbmF0aXZlQ2xhc3NJbml0QnVmZmVyKF9lbnYpOworCisgICAgamNsYXNzIElBRUNsYXNzTG9jYWwgPQorICAgICAgICBfZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKyAgICBqY2xhc3MgT09NRUNsYXNzTG9jYWwgPQorICAgICAgICAgX2Vudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvT3V0T2ZNZW1vcnlFcnJvciIpOworICAgIGpjbGFzcyBVT0VDbGFzc0xvY2FsID0KKyAgICAgICAgIF9lbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7CisgICAgamNsYXNzIEFJT09CRUNsYXNzTG9jYWwgPQorICAgICAgICAgX2Vudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisKKyAgICBJQUVDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihJQUVDbGFzc0xvY2FsKTsKKyAgICBPT01FQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYoT09NRUNsYXNzTG9jYWwpOworICAgIFVPRUNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKFVPRUNsYXNzTG9jYWwpOworICAgIEFJT09CRUNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKEFJT09CRUNsYXNzTG9jYWwpOworfQorCitzdGF0aWMgdm9pZCAqCitnZXRQb2ludGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBidWZmZXIsIGphcnJheSAqYXJyYXksIGppbnQgKnJlbWFpbmluZykKK3sKKyAgICBqaW50IHBvc2l0aW9uOworICAgIGppbnQgbGltaXQ7CisgICAgamludCBlbGVtZW50U2l6ZVNoaWZ0OworICAgIGpsb25nIHBvaW50ZXI7CisgICAgamludCBvZmZzZXQ7CisgICAgdm9pZCAqZGF0YTsKKworICAgIHBvc2l0aW9uID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBwb3NpdGlvbklEKTsKKyAgICBsaW1pdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgbGltaXRJRCk7CisgICAgZWxlbWVudFNpemVTaGlmdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgZWxlbWVudFNpemVTaGlmdElEKTsKKyAgICAqcmVtYWluaW5nID0gKGxpbWl0IC0gcG9zaXRpb24pIDw8IGVsZW1lbnRTaXplU2hpZnQ7CisgICAgcG9pbnRlciA9IF9lbnYtPkNhbGxTdGF0aWNMb25nTWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAorICAgICAgICAgICAgZ2V0QmFzZVBvaW50ZXJJRCwgYnVmZmVyKTsKKyAgICBpZiAocG9pbnRlciAhPSAwTCkgeworICAgICAgICAqYXJyYXkgPSBOVUxMOworICAgICAgICByZXR1cm4gKHZvaWQgKikgKGppbnQpIHBvaW50ZXI7CisgICAgfQorICAgIAorICAgICphcnJheSA9IChqYXJyYXkpIF9lbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QobmlvQWNjZXNzQ2xhc3MsCisgICAgICAgICAgICBnZXRCYXNlQXJyYXlJRCwgYnVmZmVyKTsKKyAgICBvZmZzZXQgPSBfZW52LT5DYWxsU3RhdGljSW50TWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAorICAgICAgICAgICAgZ2V0QmFzZUFycmF5T2Zmc2V0SUQsIGJ1ZmZlcik7CisgICAgZGF0YSA9IF9lbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoKmFycmF5LCAoamJvb2xlYW4gKikgMCk7CisgICAgCisgICAgcmV0dXJuICh2b2lkICopICgoY2hhciAqKSBkYXRhICsgb2Zmc2V0KTsKK30KKworCitzdGF0aWMgdm9pZAorcmVsZWFzZVBvaW50ZXIoSk5JRW52ICpfZW52LCBqYXJyYXkgYXJyYXksIHZvaWQgKmRhdGEsIGpib29sZWFuIGNvbW1pdCkKK3sKKyAgICBfZW52LT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChhcnJheSwgZGF0YSwKKwkJCQkJICAgY29tbWl0ID8gMCA6IEpOSV9BQk9SVCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMSGVhZGVyLmphdmEtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I3OGYzZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTEhlYWRlci5qYXZhLWlmCkBAIC0wLDAgKzEsMjIgQEAKKy8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKKworcHVibGljIGludGVyZmFjZSBHTCB7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTEltcGxIZWFkZXIuamF2YS1pbXBsIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMSW1wbEhlYWRlci5qYXZhLWltcGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIzYTQxYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTEltcGxIZWFkZXIuamF2YS1pbXBsCkBAIC0wLDAgKzEsNDggQEAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLmdsZXNfam5pOworCitpbXBvcnQgamF2YS5uaW8uQnVmZmVyOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMEV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTFFeHQ7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMUV4dGVuc2lvblBhY2s7CisKK3B1YmxpYyBjbGFzcyBHTEltcGwgaW1wbGVtZW50cyBHTDEwLCBHTDEwRXh0LCBHTDExLCBHTDExRXh0LCBHTDExRXh0ZW5zaW9uUGFjayB7CisKKyAgICAvLyBQcml2YXRlIGFjY2Vzc29ycyBmb3IgbmF0aXZlIGNvZGUKKworICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyB2b2lkIF9uYXRpdmVDbGFzc0luaXQoKTsKKyAgICBzdGF0aWMgeworCV9uYXRpdmVDbGFzc0luaXQoKTsKKyAgICB9CisKKyAgICBCdWZmZXIgX2NvbG9yUG9pbnRlciA9IG51bGw7CisgICAgQnVmZmVyIF9ub3JtYWxQb2ludGVyID0gbnVsbDsKKyAgICBCdWZmZXIgX3RleENvb3JkUG9pbnRlciA9IG51bGw7CisgICAgQnVmZmVyIF92ZXJ0ZXhQb2ludGVyID0gbnVsbDsKKworICAgIHB1YmxpYyBHTEltcGwoKSB7CisgICAgfQorCisgICAgIHB1YmxpYyB2b2lkIGdsR2V0UG9pbnRlcnYoaW50IHBuYW1lLCBqYXZhLm5pby5CdWZmZXJbXSBwYXJhbXMpIHsKKyAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiZ2xHZXRQb2ludGVydiIpOworICAgICB9CisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5jcHAgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZTEyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuY3BwCkBAIC0wLDAgKzEsMTAgQEAKKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisNCisvKiBjb25zdCBHTHVieXRlICogZ2xHZXRTdHJpbmcgKCBHTGVudW0gbmFtZSApICovDQoranN0cmluZw0KK2FuZHJvaWRfZ2xHZXRTdHJpbmcNCisgIChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgbmFtZSkgew0KKyAgICBjb25zdCBjaGFyICogY2hhcnMgPSAoY29uc3QgY2hhciAqKWdsR2V0U3RyaW5nKChHTGVudW0pbmFtZSk7DQorICAgIGpzdHJpbmcgb3V0cHV0ID0gX2Vudi0+TmV3U3RyaW5nVVRGKGNoYXJzKTsNCisgICAgcmV0dXJuIG91dHB1dDsNCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtMTAtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS0xMC1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OThmYWJjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtMTAtaWYKQEAgLTAsMCArMSw0IEBACisgICAgcHVibGljIFN0cmluZyBnbEdldFN0cmluZygNCisgICAgICAgIGludCBuYW1lDQorICAgICk7DQorDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OThmYWJjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtaWYKQEAgLTAsMCArMSw0IEBACisgICAgcHVibGljIFN0cmluZyBnbEdldFN0cmluZygNCisgICAgICAgIGludCBuYW1lDQorICAgICk7DQorDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtaW1wbCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5qYXZhLWltcGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3ODgxYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5qYXZhLWltcGwKQEAgLTAsMCArMSwxNiBAQAorICAgIC8vIEMgZnVuY3Rpb24gY29uc3QgR0x1Ynl0ZSAqIGdsR2V0U3RyaW5nICggR0xlbnVtIG5hbWUgKQ0KKw0KKyAgICBwdWJsaWMgbmF0aXZlIFN0cmluZyBfZ2xHZXRTdHJpbmcoDQorICAgICAgICBpbnQgbmFtZQ0KKyAgICApOw0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdsR2V0U3RyaW5nKA0KKyAgICAgICAgaW50IG5hbWUNCisgICAgKSB7DQorICAgICAgICBTdHJpbmcgcmV0dXJuVmFsdWU7DQorICAgICAgICByZXR1cm5WYWx1ZSA9IF9nbEdldFN0cmluZygNCisgICAgICAgICAgICBuYW1lDQorICAgICAgICApOw0KKyAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOw0KKyAgICB9DQorDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLm5hdGl2ZVJlZyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5uYXRpdmVSZWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0MTg3YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5uYXRpdmVSZWcKQEAgLTAsMCArMSBAQAoreyJfZ2xHZXRTdHJpbmciLCAiKEkpTGphdmEvbGFuZy9TdHJpbmc7IiwgKHZvaWQgKikgYW5kcm9pZF9nbEdldFN0cmluZyB9LA0K