LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW50ZXJydXB0Lmg+Cgphc20gKCIuZ2xvYmwgZXhwX3JldHVyblxuIgogICAgICJleHBfcmV0dXJuOlxuIgogICAgICIgICAgIGFkZGwgICQxMiwgJWVzcFxuIgogICAgICIgICAgIHBvcCAgICVlc3BcbiIKICAgICAiICAgICBwb3BhXG4iCiAgICAgIiAgICAgaXJldFxuIik7CgpjaGFyIGV4Y2VwdGlvbl9zdGFja1s0MDk2XTsKCi8qCiAqIEZvciBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBlYWNoIGV4Y2VwdGlvbiwgcmVmZXIgdG86CiAqIEludGVsriA2NCBhbmQgSUEtMzIgQXJjaGl0ZWN0dXJlcyBTb2Z0d2FyZSBEZXZlbG9wZXIncyBNYW51YWwKICogVm9sdW1lIDE6IEJhc2ljIEFyY2hpdGVjdHVyZQogKiBPcmRlciBOdW1iZXI6IDI1MzY2NS0wMjlVUywgTm92ZW1iZXIgMjAwOAogKiBUYWJsZSA2LTEuIEV4Y2VwdGlvbnMgYW5kIEludGVycnVwdHMKICovCkRFQ0xBUkVfRVhDRVBUSU9OKDAsIGRpdmlkZV9lcnJvcl9lbnRyeSk7CkRFQ0xBUkVfRVhDRVBUSU9OKDEsIGRlYnVnX2VudHJ5KTsKREVDTEFSRV9FWENFUFRJT04oMiwgbm1pX2ludGVycnVwdF9lbnRyeSk7CkRFQ0xBUkVfRVhDRVBUSU9OKDMsIGJyZWFrcG9pbnRfZW50cnkpOwpERUNMQVJFX0VYQ0VQVElPTig0LCBvdmVyZmxvd19lbnRyeSk7CkRFQ0xBUkVfRVhDRVBUSU9OKDUsIGJvdW5kX3JhbmdlX2V4Y2VlZGVkX2VudHJ5KTsKREVDTEFSRV9FWENFUFRJT04oNiwgaW52YWxpZF9vcGNvZGVfZW50cnkpOwpERUNMQVJFX0VYQ0VQVElPTig3LCBkZXZpY2Vfbm90X2F2YWlsYWJsZV9lbnRyeSk7CkRFQ0xBUkVfRVhDRVBUSU9OKDgsIGRvdWJsZV9mYXVsdF9lbnRyeSk7CkRFQ0xBUkVfRVhDRVBUSU9OKDksIGNvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bl9lbnRyeSk7CkRFQ0xBUkVfRVhDRVBUSU9OKDEwLCBpbnZhbGlkX3Rzc19lbnRyeSk7CkRFQ0xBUkVfRVhDRVBUSU9OKDExLCBzZWdtZW50X25vdF9wcmVzZW50X2VudHJ5KTsKREVDTEFSRV9FWENFUFRJT04oMTIsIHN0YWNrX3NlZ21lbnRfZmF1bHRfZW50cnkpOwpERUNMQVJFX0VYQ0VQVElPTigxMywgZ2VuZXJhbF9wcm90ZWN0aW9uX2VudHJ5KTsKREVDTEFSRV9FWENFUFRJT04oMTQsIHBhZ2VfZmF1bHRfZW50cnkpOwpERUNMQVJFX0VYQ0VQVElPTigxNSwgcmVzZXJ2ZWRfZXhjZXB0aW9uX2VudHJ5KTsKREVDTEFSRV9FWENFUFRJT04oMTYsIGZsb2F0aW5nX3BvaW50X2Vycm9yX2VudHJ5KTsKREVDTEFSRV9FWENFUFRJT04oMTcsIGFsaWdubWVudF9jaGVja19lbnRyeSk7CkRFQ0xBUkVfRVhDRVBUSU9OKDE4LCBtYWNoaW5lX2NoZWNrX2VudHJ5KTsKREVDTEFSRV9FWENFUFRJT04oMTksIHNpbWRfZmxvYXRpbmdfcG9pbnRfZXhjZXB0aW9uX2VudHJ5KTsKREVDTEFSRV9FWENFUFRJT04oMjAsIHJlc2VydmVkX2V4Y2VwdGlvbl9lbnRyeSk7CkRFQ0xBUkVfRVhDRVBUSU9OKDIxLCByZXNlcnZlZF9leGNlcHRpb25fZW50cnkpOwpERUNMQVJFX0VYQ0VQVElPTigyMiwgcmVzZXJ2ZWRfZXhjZXB0aW9uX2VudHJ5KTsKREVDTEFSRV9FWENFUFRJT04oMjMsIHJlc2VydmVkX2V4Y2VwdGlvbl9lbnRyeSk7CkRFQ0xBUkVfRVhDRVBUSU9OKDI0LCByZXNlcnZlZF9leGNlcHRpb25fZW50cnkpOwpERUNMQVJFX0VYQ0VQVElPTigyNSwgcmVzZXJ2ZWRfZXhjZXB0aW9uX2VudHJ5KTsKREVDTEFSRV9FWENFUFRJT04oMjYsIHJlc2VydmVkX2V4Y2VwdGlvbl9lbnRyeSk7CkRFQ0xBUkVfRVhDRVBUSU9OKDI3LCByZXNlcnZlZF9leGNlcHRpb25fZW50cnkpOwpERUNMQVJFX0VYQ0VQVElPTigyOCwgcmVzZXJ2ZWRfZXhjZXB0aW9uX2VudHJ5KTsKREVDTEFSRV9FWENFUFRJT04oMjksIHJlc2VydmVkX2V4Y2VwdGlvbl9lbnRyeSk7CkRFQ0xBUkVfRVhDRVBUSU9OKDMwLCByZXNlcnZlZF9leGNlcHRpb25fZW50cnkpOwpERUNMQVJFX0VYQ0VQVElPTigzMSwgcmVzZXJ2ZWRfZXhjZXB0aW9uX2VudHJ5KTsKCl9faXNyX18gcmVzZXJ2ZWRfZXhjZXB0aW9uX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIlJlc2VydmVkIEV4Y2VwdGlvbiAlZCBhdCAlMDR4OiUwOHhcbiIsIGNhdXNlLCBzZWcsIGlwKTsKfQoKX19pc3JfXyBkaXZpZGVfZXJyb3JfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiRGl2aWRlIEVycm9yIChEaXZpc2lvbiBieSB6ZXJvKSBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwoJd2hpbGUoMSk7Cn0KCl9faXNyX18gZGVidWdfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiRGVidWcgSW50ZXJydXB0IChTaW5nbGUgc3RlcCkgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKfQoKX19pc3JfXyBubWlfaW50ZXJydXB0X2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIk5NSSBJbnRlcnJ1cHQgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKfQoKX19pc3JfXyBicmVha3BvaW50X2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIkJyZWFrcG9pbnQgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKfQoKX19pc3JfXyBvdmVyZmxvd19lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykKewoJcHJpbnRmKCJPdmVyZmxvdyBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwoJd2hpbGUoMSk7Cn0KCl9faXNyX18gYm91bmRfcmFuZ2VfZXhjZWVkZWRfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiQk9VTkQgUmFuZ2UgRXhjZWVkZWQgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKCXdoaWxlKDEpOwp9CgpfX2lzcl9fIGludmFsaWRfb3Bjb2RlX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIkludmFsaWQgT3Bjb2RlIChVbkRlZmluZWQgT3Bjb2RlKSBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwoJd2hpbGUoMSk7Cn0KCl9faXNyX18gZGV2aWNlX25vdF9hdmFpbGFibGVfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiRGV2aWNlIE5vdCBBdmFpbGFibGUgKE5vIE1hdGggQ29wcm9jZXNzb3IpIGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7Cgl3aGlsZSgxKTsKfQoKX19pc3JfXyBkb3VibGVfZmF1bHRfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiRG91YmxlIGZhdWx0IGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7Cgl3aGlsZSgxKTsKfQoKX19pc3JfXyBjb3Byb2Nlc3Nvcl9zZWdtZW50X292ZXJydW5fZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiQ28tcHJvY2Vzc29yIHNlZ21lbnQgb3ZlcnJ1biBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwoJd2hpbGUoMSk7Cn0KCl9faXNyX18gaW52YWxpZF90c3NfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiSW52YWxpZCBUU1MgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKfQoKX19pc3JfXyBzZWdtZW50X25vdF9wcmVzZW50X2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIlNlZ21lbnQgTm90IFByZXNlbnQgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKCXdoaWxlKDEpOwp9CgpfX2lzcl9fIHN0YWNrX3NlZ21lbnRfZmF1bHRfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiU3RhY2sgU2VnbWVudCBGYXVsdCBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwoJd2hpbGUoMSk7Cn0KCl9faXNyX18gZ2VuZXJhbF9wcm90ZWN0aW9uX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIkdlbmVyYWwgUHJvdGVjdGlvbiBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwp9CgpfX2lzcl9fIHBhZ2VfZmF1bHRfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiUGFnZSBmYXVsdCBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwoJd2hpbGUoMSk7Cn0KCl9faXNyX18gZmxvYXRpbmdfcG9pbnRfZXJyb3JfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiRmxvYXRpbmctUG9pbnQgRXJyb3IgKE1hdGggRmF1bHQpIGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7Cn0KCl9faXNyX18gYWxpZ25tZW50X2NoZWNrX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIkFsaWdubWVudCBjaGVjayBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwp9CgpfX2lzcl9fIG1hY2hpbmVfY2hlY2tfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpCnsKCXByaW50ZigiTWFjaGluZSBDaGVjayBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwp9CgpfX2lzcl9fIHNpbWRfZmxvYXRpbmdfcG9pbnRfZXhjZXB0aW9uX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKQp7CglwcmludGYoIlNJTUQgRmxvYXRpbmctUG9pbnQgRXhjZXB0aW9uIGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7Cn0KCmludCBjcHVfaW5pdF9leGNlcHRpb25zKHZvaWQpCnsKCS8qIEp1c3QgaW4gY2FzZS4uLiAqLwoJZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CgoJLyogU2V0dXAgZXhjZXB0aW9ucyAqLwoJc2V0X3ZlY3RvcigweDAwLCBleHBfMCk7CglzZXRfdmVjdG9yKDB4MDEsIGV4cF8xKTsKCXNldF92ZWN0b3IoMHgwMiwgZXhwXzIpOwoJc2V0X3ZlY3RvcigweDAzLCBleHBfMyk7CglzZXRfdmVjdG9yKDB4MDQsIGV4cF80KTsKCXNldF92ZWN0b3IoMHgwNSwgZXhwXzUpOwoJc2V0X3ZlY3RvcigweDA2LCBleHBfNik7CglzZXRfdmVjdG9yKDB4MDcsIGV4cF83KTsKCXNldF92ZWN0b3IoMHgwOCwgZXhwXzgpOwoJc2V0X3ZlY3RvcigweDA5LCBleHBfOSk7CglzZXRfdmVjdG9yKDB4MGEsIGV4cF8xMCk7CglzZXRfdmVjdG9yKDB4MGIsIGV4cF8xMSk7CglzZXRfdmVjdG9yKDB4MGMsIGV4cF8xMik7CglzZXRfdmVjdG9yKDB4MGQsIGV4cF8xMyk7CglzZXRfdmVjdG9yKDB4MGUsIGV4cF8xNCk7CglzZXRfdmVjdG9yKDB4MGYsIGV4cF8xNSk7CglzZXRfdmVjdG9yKDB4MTAsIGV4cF8xNik7CglzZXRfdmVjdG9yKDB4MTEsIGV4cF8xNyk7CglzZXRfdmVjdG9yKDB4MTIsIGV4cF8xOCk7CglzZXRfdmVjdG9yKDB4MTMsIGV4cF8xOSk7CglzZXRfdmVjdG9yKDB4MTQsIGV4cF8yMCk7CglzZXRfdmVjdG9yKDB4MTUsIGV4cF8yMSk7CglzZXRfdmVjdG9yKDB4MTYsIGV4cF8yMik7CglzZXRfdmVjdG9yKDB4MTcsIGV4cF8yMyk7CglzZXRfdmVjdG9yKDB4MTgsIGV4cF8yNCk7CglzZXRfdmVjdG9yKDB4MTksIGV4cF8yNSk7CglzZXRfdmVjdG9yKDB4MWEsIGV4cF8yNik7CglzZXRfdmVjdG9yKDB4MWIsIGV4cF8yNyk7CglzZXRfdmVjdG9yKDB4MWMsIGV4cF8yOCk7CglzZXRfdmVjdG9yKDB4MWQsIGV4cF8yOSk7CglzZXRfdmVjdG9yKDB4MWUsIGV4cF8zMCk7CglzZXRfdmVjdG9yKDB4MWYsIGV4cF8zMSk7CgoJLyogSXQgaXMgbm93IHNhZmUgdG8gZW5hYmxlIGludGVycnVwdHMgKi8KCWVuYWJsZV9pbnRlcnJ1cHRzKCk7CgoJcmV0dXJuIDA7Cn0K